• Java提升二:Lambda表达式与方法引用


    1、Lambda表达式

    1.1、定义

    lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式。它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达式则更为简洁。

    1.2、使用

    lambda表达式的写法:
    (需要实现的方法的参数)->{对于方法的具体实现}

    代码展示:

    先定义一个函数式接口,并定义方法使用函数式接口。

    //函数式接口
     interface Cook{
        //无参数无返回值的抽象方法
        public void cooking(String person);
    }
    //函数式接口作为方法的参数使用
      public static void invokeCook(String person,Cook cook){
            cook.cooking(person);
        }
    

    若使用匿名内部类进行实现:

    //使用匿名内部类实现Cook接口中的方法重写
            invokeCook("小明", new Cook() {
                @Override
                public void cooking(String person) {
                    System.out.println(person+"快做饭");
                }
            });
    

    改用lambda表达式优化:

     //使用lambda表达式实现Cook接口中的方法重写
            invokeCook("小明",(person)->{
                System.out.println(person+"快做饭");
            });
        }
    

    使用lambda表达式传参时,()中所传入的参数名可以不带类型标识符,但参数名必须于函数式接口中的方法的形参名保持一致。当lambda表达式要传递的参数为单参,且实现语句为单句时,可改写为如下形式:

     //使用lambda表达式实现Cook接口中的方法重写
       invokeCook("小明",person->System.out.println(person+"快做饭");
            );
        }
    

    1.3、总结

    (1) lambda表达式针对于函数式接口使用,使用形式简便,使用范围较小。
    (2) lambda表达式是匿名内部类的进一步提炼优化,称为匿名内部类的语法糖。
    (3) lambda表达式()中传入的参数是要实现的函数式接口中的抽象方法的形参。

    2、方法引用

    2.1、定义

    方法引用是用来直接访问类或者实例已经存在的方法(注意:不是创建或实现方法)或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。运行时,方法引用会创建函数式接口的一个实例。

    2.2、使用

    方法引用的写法:类名::已存在的方法

    代码展示

    先定义一个函数式接口,并定义方法使用函数式接口。

    //函数式接口
    @FunctionalInterface
    interface Printable{
        //打印字符串的抽象方法
        void printMethod(String s);
    }
     //定义一个方法,参数传入函数式接口,对字符串进行打印
      public static void printString(Printable p){
            p.printMethod("hellowrold");
        }
    

    若使用匿名内部类进行实现:

     //使用匿名内部类实现
            printString(new Printable() {
                @Override
                public void printMethod(String s) {
                    System.out.println(s);
                }
            });
    

    改用lambda表达式优化:

     //调用printString方法,因为参数是函数式接口,可以使用Lambda表达式
            printString((s)->{
                System.out.println(s);
            });
    

    用方法引用优化:

     //使用方法引用
     //对象System.out已经存在,方法println也已经存在,
     //可直接使用方法引用简化lambda表达式。
      printString(System.out::println);
    

    2.3、总结

    (1)方法引用仅针对于函数式接口使用,调用函数式接口的抽象方法时,类名::方法表示的就是对于抽象方法的实现代码;调用其他方法时,都是只能调用类中已经存在的方法。
    (2)方法引用与lambda表达式相比较,方法引用的使用范围更小,方式更简洁,便于在大量复用
    (3)总体而言,方法引用是lambda表达式的语法糖。

  • 相关阅读:
    Apache工作原理
    Mysql主从复制
    Apache 工作模式
    Codeforces 932E Team Work
    【TJOI2018】教科书般的亵渎
    Codeforces 960G Bandit Blues
    斯特林数&斯特林反演
    【BZOJ4916】神犇与蒟蒻
    【BZOJ3944】Sum
    【BZOJ4805】欧拉函数求和
  • 原文地址:https://www.cnblogs.com/zjL1997/p/12315789.html
Copyright © 2020-2023  润新知