乐趣区

关于java:Lambda表达式详解

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. 样例

    状况一:@Test
    public 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");
    }
    状况二:@Test
    public 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)");
    }
    状况三:@Test
    public 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

退出移动版