Java Lambda表达式(二)
Java Lambda表达式(二)
兴趣使然的程序员 发表于10个月前
Java Lambda表达式(二)
  • 发表于 10个月前
  • 阅读 16
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

Java8提供了::操作符,用于简化lambda表达式中引用方法的写法。可以认为::操作符即是引用标识

以下是::操作符主要的使用情况:

  • 对象::实例方法
  • 类::静态方法
  • 类::实例方法
  • 类::构造器方法

在前两种情况中,方法引用等同于提供方法参数的Lambda表达式,例如:

//按钮被点击时打印event对象
button.setOnAction(event->System.out.println(event));

//类::静态方法
button.setOnAction(System.out::println);

//类似的(x,y) -> Math.pow(x,y)相当于Math::pow

在第三种情况中,第一个参数会变成执行方法的对象,例如:

//Stirng::compareToIgnoreCase相当于(x,y)->x.compareToIgnoreCase(y)

在这种情况中可以使用this或者super:

//父类
class Greeter{
    public void greet(){
        System.out.println("Hello World!!");
    }
}

//子类
class  ConcurrentGreeter extends Greeter{
    public void greet(){
        //使用Lambda表达式替代Runnable接口实现
        Thread t1 = new Thread(super::greet);

        //使用接口的匿名实现
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                new Greeter().greet();
            }
        });
    }
}

::同样可以用于引用构造器。引用构造器和“类::实例方法”类似,不同之处在于方法名为“new”

//lambda表达式
x->new int[x];

//构造器引用
int[]::new

//下面是一个有趣的例子,将“构造器引用”(在这个例子中实际上是一个Function接口)放到Map中
static Map<String, Function<Integer, Fruit>> map = new HashMap<>();
static {
    map.put("apple", Apple::new);
    map.put("orange", Orange::new);
    // etc...
}
public static Fruit giveMeFruit(String fruit, Integer weight){
    return map.get(fruit.toLowerCase())
                           .apply(weight);
}

 

共有 人打赏支持
粉丝 18
博文 107
码字总数 79840
×
兴趣使然的程序员
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: