Java8-Lambda 方法的引用

实例方法和类方法

引用实例方法

自动把调用方法的时候的参数,全部传给引用的方法

<函数式接口> <变量名> = <实例>::<实例方法名>;
// 自动把[实参]全部传递给引用的实例方法
<变量名>.<接口方法名>([实参]);

引用类方法

全部参数传递给引用的方法

<函数式接口> <变量名> = <类>::<类方法名>;
// 自动把[实参]全部传递给引用的类方法
<变量名>.<接口方法名>([实参]);

引用实例方法和类方法的实例Demo

package market.daoge.recode.java8;

import java.util.Arrays;

public interface MethodRef {
    void test(String s);
}

interface MethodRef1 {
    void test(int[] arr);
}

class TestMethodRef {
    public static void main(String[] args) {
        MethodRef r = (s) -> System.out.println(s);
        r.test("字符串的");

        // 使用方法的引用:实例方法的应用
        // System.out是一个实例
        MethodRef r1 = System.out::println;
        r1.test("方法引用");

        // 能够根据函数式接口的方法参数,推断应用的方法的参数的数据类型
        // 不引用方法进行排序
        MethodRef1 r3 = (o) -> Arrays.sort(o);
        //引用类方法
        MethodRef1 r2 = Arrays::sort;
        int[] a = new int[]{4,3,5,34,23};
        // 以后用方法排序
        r2.test(a);
        // 引用方法输出
        r1.test(Arrays.toString(a));
    }
}

类的实例方法

引用类的实例方法

定义,调用接口方法的时候,需要多一个参数,并且参数的类型和引用实例方法的类型必须一致,把第一个参数作为引用的实例,后面的每一个参数全部传递给引用的方法。

interface <函数式接口> {
<返回值> <方法名>(<类型><名称>[,其他的参数…]);
}
<函数式接口> <变量名> = <类>::<实例方法名>;
<变量名>.<方法名>(<类名的实例>[,其他参数]);

引用类的实例方法的实例Demo


interface MethodRef2 {
    void test(PrintStream out, String str);
}

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

        // 引用类的实例方法
        MethodRef2 r4 = PrintStream::println;
        // 第二个之后的参数,作为引用到的方法的参数
        r4.test(System.out,"第二个参数");

    }
}

构造器引用

构造器引用

把方法的所有参数全部传递给引用的构造器,根据参数的类型推断调用的构造器。

<类名>::new

构造器引用实例Demo

interface MethodRef4 {
    String test(char[] cs);
}

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

        // 引用构造器,根据函数式接口的方法名来判断应用哪一个构造器
        MethodRef4 r4 = String::new;
        String ok = r4.test(new char[]{'道','哥'});
        System.out.println(ok);

        // 不用构造器引用的写法
        MethodRef4 r5 = (c) -> {
            return new String(c);
        };
        r5.test(new char[]{'道','哥'});

    }
}
点赞