java 1.8 :: 使用总结

public class Person {
    private String name;

    Person() {
    }

    Person(String name) {
        this.name = name;
    }

    static String say(String something) {
        return something;
    }

    String sing(String songName) {
        return songName;
    }

    void dance(String str){
        System.out.println(str);
    }

}

定义一个Person类,有构造方法,静态方法say和非静态方法sing、dance

  • 使用 :: 引用 构造方法
import java.util.function.Function;

public class Test {
    public static void main(String[] args) {

        //访问构造方法
        Function<String, Person> function = Person::new;
        Person person = function.apply("张医生");

    }
}
  • 使用 :: 引用静态方法
import java.util.function.Function;

public class Test {
    public static void main(String[] args) {

        //访问静态方法
        Function<String, String> function = Person::say;
        String say = function.apply("helle");
        System.out.println("say:" + say);

    }
}
  • 使用 :: 引用非静态方法
import java.util.function.Function;

public class Test {
    public static void main(String[] args) {

        //访问非静态方法
        Person person1 = new Person();
        Function<String, String> sing = person1::sing;
        String songName = sing.apply("月亮之上");
        System.out.println("songName:" + songName);

    }
}

可以看到 :: 引用都会返回java.util.function.Function对象,这是jdk提供的 functional interface,Function<T,R>对象只有一个抽象方法 R apply(T var1); 传参为类型 T,返回类型 R。

因此我们访问person类的方法时,jdk能够根据Function接口定义的"模板"匹配到相应的方法。

这里的Function也可以通过自定义实现。只要满足functional interface即可。

出了上面三种使用方式外,:: 还可以引用超类方法,和数组构造器

  • 使用 :: 引用超类方法
public class Doctor extends Person {

    Doctor() {
    }

    void dance() {
        List<String> list = Arrays.asList("1234", "2234", "3234");
        list.forEach(super::dance);
    }

}
public class Test {
    public static void main(String[] args) {

        Doctor d = new Doctor();
        d.dance();
    }
}
  • 使用 :: 引用数据构造器
    
    public class Test {
        public static void main(String[] args) {
    
            //访问数组构造器
            Function<Integer,Person[]> function = Person[]::new;
            Person[] personArray = function.apply(4);
            for (Person person : personArray) {
                System.out.println(person);//输出4个空对象
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值