双冒号之方法引用
Integer::parseInt;
Integer::new;
以上两种写法是什么意思?
写法的演变
首先我们需要定义一个接口:
interface Demo{
int method(String s);
}
1、匿名内部类
使用匿名内部类的方法定义一个对象,如下:
Demo demo1 = new Demo() {
@Override
public int method(String s) {
return Integer.parseInt(s);
}
};
int v1 = demo1.method("111");
System.out.println(v1);
2、lambda表达式
为了简化匿名内部类里的代码,我们可以使用lambda表达式,
因为子类创建后都是Demo类型的,所以new Dem()这一部分我们可以省略掉,自然而然的大括号我们也省去了,@Override也省略,最后就变为了只有一个方法,这个方法的返回值和参数类型是固定不变的,为Demo接口的返回值类型、参数类型,所以返回值类型、参数类型也省略不写了,最终只剩下参数s,我们最终可以简写为以下形式:
Demo demo2 = s -> {
return Integer.parseInt(s);
};
int v2 = demo2.method("222");
System.out.println(v2);
3、lambda表达式对应的子类方法中,只有一行代码
如果方法内部只有一行代码,大括号就可以省略不写了,相应的return关键字也可以省去,最终变为以下形式:
Demo demo3 = s -> Integer.parseInt(s);
int v3= demo3.method("333");
System.out.println(v3);
4、lambda表达式对应的子类方法中,只有一行代码,并且此方法是外部定义
如果方法这一行代码不是我们自己写的逻辑,引用了别的类现成的方法,可以使用::表示方法引用,如下:
Demo demo4 = Integer::parseInt;
int v4= demo4.method("444");
System.out.println(v4);
5、lambda表达式对应的子类方法中,只有一行代码,并且此方法是外部定义,并且引用了构造方法
可以写为以下形式:
Demo demo5 = Integer::new;
int v5= demo5.method("555");
System.out.println(v5);