2019-11-22
Java8新增了函数式接口运算符::,它可以用来声明静态成员的调用、对象方法的调用、类构造器的调用。每一种调用都要有一个对应的模板:方法签名一致的函数式接口。
eg:
##Plate.java
public class Plate {
public Plate(){
System.out.println("Plate()");
}
public Plate(String a){
System.out.println("Plate(String a) : " + a);
}
public String fly(){
return "I can fly";
}
public String boom(){
return "boom";
}
static String fire(String target){
return "shoot target :" + target;
}
}
函数式接口:
##FunInterfaceP.java
public interface FunInterfaceP<P> {
void convert(P p);
}
##FunInterfaceT.java
public interface FunInterfaceT<T> {
T convert();
}
##FunInterfaceTP.java
public interface FunInterfaceTP<T, P> {
T convert(P p);
}
调用:
//调用无参构造器
FunInterfaceT<Plate> plate = Plate::new;
Plate p = plate.convert();
//调用无有参构造器
FunInterfaceTP<Plate, String> plate2 = Plate::new;
Plate p2 = plate2.convert("PlateTwo");
//调用对象的无参函数
FunInterfaceT<String> mirror1 = p::fly;
System.out.println(mirror1.convert());
//调用对象的有参函数
FunInterfaceTP<String, Integer> mirror2 = p::boom;
System.out.println(mirror2.convert(1));
//调用静态函数
FunInterfaceTP<String, String> mirror3 = Plate::fire;
System.out.println(mirror3.convert("aobama"));
//特别的,若不接收返回值时,可使用对应的无返回值的模板函数
FunInterface mirror4 = p::fly;
mirror4.convert();
FunInterfaceP<Integer> mirror5 = p::boom;
mirror5.convert(1);
由此可见,使用运算符::时,需要有对应的函数式接口,或至少是方法签名一致的函数式接口方法。
网友评论