java8鸡肋的::特性么?

2019-11-22  本文已影响0人  天冷请穿衣

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);

由此可见,使用运算符::时,需要有对应的函数式接口,或至少是方法签名一致的函数式接口方法。

上一篇下一篇

猜你喜欢

热点阅读