Lambda表达式的应用

前置介绍

函数式接口:如果一个接口中,只申明了一个形象办法,则此接口就称为函数式接口。
lambda表达式的实质:作为函数式接口的实例
何时应用:当须要对一个函数式接口实例化的时候,能够应用lambda表达式。

Lambda表达式的根本语法

  1. 举例:(o1,o2) -> Integer.compare(o1,o2);
  2. 格局:
    :lambda操作符 或 箭头操作符
    右边:lambda形参列表 (接口中的形象办法的形参列表)
    左边:lambda体 (重写的形象办法的办法体)

    六种语法格局

    语法格局一:无参,无返回值

    Runnable r1 = () -> {System.out.println("hello lambda!");};

    语法格局二:Lambda须要一个参数,然而没有返回值

    Consumer<String> con = (String str) -> {System.out.println(str);};

    语法格局三:数据类型能够省略,因为可由编译器推断得出,称为“类型推断”

    Consumer<String> con = (str) -> {System.out.println(str);};

    语法格局四:Lambda若只须要一个参数时,参数的小括号能够省略

    Consumer<String> con = str -> {System.out.println(str);};

    语法格局五:Lambda若只须要两个或以上的参数,多条执行语句,并且能够有返回值

    Consumer<Integer> con = (x,y) -> {     System.out.println("实现函数式接口办法!");     return Integer.compare(x,y);};

    语法格局六:当Lambda体只有一条语句时,return与大括号若有,都能够省略

    Consumer<Integer> con = (x,y) -> Integer.compare(x,y);

    总结六种状况:
    右边:lambda形参列表的参数类型能够省略(类型推断);如果lambda形参列表只有一个参数,其一对()也能够省略
    左边:lambda体应该应用一对{}包裹;如果lambda体只有一条执行语句(可能是return语句,省略这对{}和return关键字)

办法援用

  1. 应用情境:当要传递给lambda体的操作,曾经有实现的办法了,能够应用办法援用!
  2. 办法援用,实质上就是lambda表达式,而lambda表达式作为函数式接口的实例,所以办法援用,也是函数式接口的实例。
  3. 应用格局:类(或对象)::办法名
  4. 具体分为如下的三种状况
    状况1 对象::非静态方法
    状况2 类::静态方法
    状况3 类::非静态方法
  5. 办法援用应用的要求:要求接口中的形象办法的形参列表和返回值类型与办法援用的办法的形参列表和返回值类型雷同!(针对于状况1和状况2)
    当函数式接口办法的第一个参数是须要援用办法的调用者,并且第二个参数是须要援用办法的参数(或无参数)时:ClassName::methodName(针对于状况3)
  6. 应用倡议
    如果给函数式接口提供实例,恰好满足办法援用的应用情境,就能够思考应用办法援用给函数式接口提供实例。如果不相熟办法援用,还是能够应用lambda表达式
  7. 样例

    状况一:@Testpublic void test1() {     Consumer<String> con1 = str -> System.out.println(str);     con1.accept("北京");     System.out.println("***************");     PrintStream ps = System.out;     Consumer<String> con2 = ps::println;     con2.accept("beijing");}
    状况二:@Testpublic void test2() {     Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);     System.out.println(com1.compare(12,21));     System.out.println("***************");     Comparator<Integer> com2 = Integer::compare;         System.out.println("com2.compare(12,3)");}
    状况三:@Testpublic void test3() {     Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);     System.out.println(com1.compare("abc","abd"));     System.out.println("***************");     Comparator<String> com2 = String::compareTo;     System.out.println("com2.compare("abd","abm")");}

    结构器援用
    格局:类名::new
    要求:和办法援用相似,函数式接口的形象办法形参列表和结构器的形参列表统一。形象办法的返回值类型即为结构器所属的类的类型
    数组援用
    格局:数组类型[] :: new