1.简介
(1).概念
方法引用本质上就是Lambda表达式,Lambda表达式是函数式接口的实例,所以说方法引用也是函数式接口的实例。

(2).使用场景
当要传递给Lambda体的操作,已经有实现的方法了,就可以使用方法引用。

(3).使用条件
接口中的抽象方法的形参列表和返回值类型与方法引用的方法形参列表和返回值相同。

2.语法
方法引用使用一对冒号(::)来引用方法,格式如下。

类或对象 :: 方法名

3.使用实例
(1).类引用实例方法

public class Test {
    public static void main(String[] args) {
        //类引用实例方法,compareTo()为实例方法
        Comparator<String> comparator = String::compareTo;
        int compare = comparator.compare("Hello", "Hello");
        System.out.println(compare);
    }
}

(2).对象引用实例方法

public class Test {
    public static void main(String[] args) {
        Consumer<String> consumer = System.out::println;
        consumer.accept("只消费,不返回");
    }
}

(3).类引用静态方法

public class Test {
    public static void main(String[] args) {
        //类引用静态方法(compare()为静态方法)
        Comparator<Integer> comparator = Integer::compare;
        System.out.println(comparator.compare(12, 11));
    }
}

(4).类引用构造方法

public class Test {
    static class Person {
        private String name;

        public Person() {
            System.out.println("无参数构造方法执行了");
        }

        public Person(String name) {
            System.out.println("单参数构造方法执行了");
            this.name = name;
        }

        public String getName() {
            return name;
        }

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

    }


    public static void main(String[] args) {
        //使用Lambda表达式,调用无参构造方法
        Supplier<Person> supplier1 = () -> new Person();
        supplier1.get();

        //使用方法引用,引用无参构造方法
        Supplier<Person> supplier2 = Person::new;
        supplier2.get();

        //使用Lambda表达式,调用单参构造方法
        Function<String, Person> function1 = name -> new Person(name);
        Person person1 = function1.apply("小慕");
        System.out.println(person1.getName());
        
        //使用方法引用,引用单参构造方法
        Function<String, Person> function2 = Person::new;
        Person person2 = function1.apply("小明");
        System.out.println(person2.getName());
    }
}