* 方法引用的使用

 * 1.使用情境:当要传递给lambda体的操作,已经有实现的方法了,可以使用方法引用

 * 2.方法引用,本质上就是lambda表达式,而Lambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的实例。

 * 3.使用格式:类(或对象)::方法名

 * 4.具体分为如下的三种情况:

 *    对象::非静态方法

 *    类::静态方法

 *    类::非静态方法  (要求接口抽象方法形参的第一个参数作为方法引用的调用者)

 *  5.方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同(对于情况1和情况2)

 *  6.构造器引用

 *          和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致

 *          抽象方法的返回值类型即为构造器所属类的类型

 *  7.数组引用

 *          可以把数组看作是一个特殊的类,则写法与构造器引用一致

public class MethodReference {
    public static void main(String[] args) {
        //情况三:类::非静态方法
        Comparator<Integer> integerComp1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        };
        Comparator<Integer> integerLambda = (o1, o2)->o1.compareTo(o2);
        Comparator<Integer> integerRefer = Integer::compareTo;
        System.out.println(integerRefer.compare(1,2));

        //情况一:对象::实例方法
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String str) {
                System.out.println(str);
            }
        };
        Consumer<String> lambdaConsumer = str-> System.out.println(str);
        PrintStream ps = System.out;
        Consumer<String> methodRefConsumer = ps::println;
        methodRefConsumer.accept("hello");

        //情况2:类::静态方法
        Supplier<String> supplier = new Supplier<String>() {
            @Override
            public String get() {
                return getStr();
            }
        };
        Supplier<String> lambdaSupp = () -> getStr();
        Supplier<String> methodRefSupp = MethodReference::getStr;
        System.out.println(methodRefSupp.get());

        //情况5:构造器引用
        //同情况1、2,接口抽象方法形参和方法应用新参一样。如以下例子:String get()同 String()构造方法新参
        Supplier<String> s = new Supplier<String>() {
            @Override
            public String get() {
                return new String();
            }
        };
        Supplier conLambda = ()->new String();
        Supplier conRef = String::new;
        Function<String, String> paraConfRef = String::new;  //有参构造器

        //情况6:数组引用
        Function<Integer, String[]> arrayFunc = length -> new String[length];
        Function<Integer, String[]> arrayRef = String[] :: new;
        System.out.println(Arrays.toString(arrayRef.apply(2)));
    }

    public static String getStr() {
        return "666";
    }
}

 

 

* 方法引用的使用
* 1.使用情境:当要传递给lambda体的操作,已经有实现的方法了,可以使用方法引用!
* 2.方法引用,本质上就是lambda表达式,而Lambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的实例。
* 3.使用格式:类(或对象)::方法名
* 4.具体分为如下的三种情况:
* 对象::非静态方法
* 类::静态方法
* 类::非静态方法 (要求接口抽象方法形参的第一个参数作为方法引用的调用者)
* 5.方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同(对于情况1和情况2)
* 6.构造器引用
* 和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致
* 抽象方法的返回值类型即为构造器所属类的类型
* 7.数组引用
* 可以把数组看作是一个特殊的类,则写法与构造器引用一致