美文网首页
Java8-Lambda 方法的引用

Java8-Lambda 方法的引用

作者: 任重而道元 | 来源:发表于2017-08-06 17:23 被阅读26次

    实例方法和类方法

    引用实例方法

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

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

    引用类方法

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

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

    引用实例方法和类方法的实例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[]{'道','哥'});
    
        }
    }
    

    相关文章

      网友评论

          本文标题:Java8-Lambda 方法的引用

          本文链接:https://www.haomeiwen.com/subject/ntfnlxtx.html