Java8学习笔记(五)—— 方法引用(::双冒号操作符)

Java8学习笔记系列:

Java8学习笔记(一)—— 函数式编程的四个基本接口

Java8学习笔记(二)—— Lambda表达式

Java8学习笔记(三)—— Optional类的使用

Java8学习笔记(四) —— Stream流式编程

Java8学习笔记(五)—— 方法引用(::双冒号操作符)

一、什么是方法引用?

        简单来说就是一个Lambda表达式,方法引用提供了一种引用而不执行方法的方式,运行时,方法引用会创建一个函数式接口的实例。

如下所示:

    @Test
    public void example1(){

        //使用Lambda表达式
        Consumer consumer1 = x -> System.out.println(x);
        consumer1.accept("Lambda表达式");

        //使用方法引用
        Consumer consumer2 = System.out::println;
        consumer2.accept("方法引用::");
    }

二、方法引用的五种方式

① 引用对象的实例方法 对象::实例方法名

② 引用类的静态方法 类::静态方法名

③ 引用类的实例方法 类::实例方法名

④ 引用构造方法 类::new

⑤ 数组引用 类型::new

使用示例如下:

/**
 * 引用类
 */
class Human{
    private String name;
    private int age;

    public Human(){ }
    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static String getNationality(){
        return "中国";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
    /**
     * 引用对象的实例方法
     */
    @Test
    public void example3(){
        Human human = new Human("小白",20);

        //使用Lambda表达式
        Supplier supplier1 = () -> human.getName();
        System.out.println(supplier1.get());

        //使用方法引用
        Supplier supplier2 = human::getName;
        System.out.println(supplier2.get());
    }

    /**
     * 引用类的静态方法
     */
    @Test
    public void example4(){
        //使用Lambda表达式
        Supplier supplier1 = () -> Human.getNationality();
        System.out.println(supplier1.get());

        //使用方法引用
        Supplier supplier2 = Human::getNationality;
        System.out.println(supplier2.get());
    }

    /**
     * 引用类的实例方法名
     */
    @Test
    public void example5(){
        Human human = new Human("小白",20);

        //使用Lambda表达式
        Function function1 = p -> p.getName();
        System.out.println(function1.apply(human));

        //使用方法引用
        Function function2 = Human::getName;
        System.out.println(function2.apply(human));
    }

    /**
     * 引用构造方法
     */
    @Test
    public void example6(){

        //使用Lambda表达式
        Supplier supplier1 = () -> new Human();
        System.out.println(supplier1.get() instanceof Human); //true

        //使用方法引用
        Supplier supplier2 = Human::new;
        System.out.println(supplier2.get() instanceof Human); //true
    }

    /**
     * 引用数组
     */
    @Test
    public void example7(){
        //使用Lambda表达式
        Function function1 = x -> new String[]{x.toString()};
        System.out.println(function1.apply(10) instanceof String[]); //true

        //使用方法引用
        Function function2 = String[]::new;
        System.out.println(function2.apply(10) instanceof String[]); //true
    }

参考:

1、java8新特性之---方法引用

你可能感兴趣的:(Java8)