JavaSE|Day35.Java 8新特性: Lambda表达式、函数式接口

目录
Java8新特性
Lambda表达式
函数式(Functional)接口

Java8新特性 【JavaSE|Day35.Java 8新特性: Lambda表达式、函数式接口】
Lambda表达式

  • Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以
    传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更
    灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了
    提升。
  • 代码举例
public class LambdaTest { @Test public void test1(){ Runnable r1 = new Runnable() { @Override public void run() { System.out.println("我爱北京天安门"); } }; r1.run(); System.out.println("---------------------"); //Lambda表达式 Runnable r2 = () -> System.out.println("我爱北京故宫"); r2.run(); } @Test public void test2(){ Comparator com1 = new Comparator() { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1,o2); } }; int compare1 = com1.compare(12,21); System.out.println(compare1); //-1System.out.println("-----------------------"); //Lambdad表达式写法 Comparator com2 = (o1,o2) -> Integer.compare(o1,o2); int compare2 = com2.compare(12,21); System.out.println(compare2); //-1System.out.println("-----------------------"); //方法引用 Comparator com3 = Integer :: compare; int compare3 = com2.compare(12,21); System.out.println(compare3); //-1 } }

  • 代码实现
/* * Lambda表达式的使用 * * 1.举例 : (o1,o2) -> Integer.compare(o1,p2); * 2.格式 : *-> :Lambda操作符 或 箭头操作符 *->左边 :Lambda形参列表 (其实就是接口中抽象方法的形参列表) *->右边 :Lambda体 (其实就是重写的抽象方法的方法体) * 3.Lambda表达式的使用: (分6种情况介绍) * *总结: *->左边: Lambda形参列表的参数类型可以省略(类型推断): 如果Lambda形参列表,其()也可以省略 *->右边: Lambda体应该使用一对{}包裹: 如果Lambda体只有一条执行语句(可能是return语句),可以省略这一对{}和return关键字 * * 4.Lambda表达式本质: 作为函数式接口的实例 * * 5.如果接口中,只声明了一个抽象方法,则此接口被称为函数式接口。 * 我们可以在一个接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口。 * 同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。 * * 6.所以以前用匿名实现类表示的现在都可以用Lambda表达式来写。 * */public class LambdaTest1 { //语法格式一:无参,无返回值 @Test public void test1(){ Runnable r1 = new Runnable() { @Override public void run() { System.out.println("我爱北京天安门"); } }; r1.run(); System.out.println("---------------------"); Runnable r2 = () -> { System.out.println("我爱北京故宫"); }; r2.run(); }//语法格式二:Lambda 需要一个参数,但是没有返回值。 @Test public void test2(){ Consumer con = new Consumer() { @Override public void accept(String s) { System.out.println("s"); } }; con.accept("谎言和誓言的区别是什么?"); System.out.println("-----------------------"); Consumer con1 = (String s) ->{ System.out.println("s"); }; con1.accept("一个是听的人当真了,一个是说的人当真了"); }//语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断” @Test public void test3(){ Consumer con1 = (String s) ->{ System.out.println("s"); }; con1.accept("一个是听的人当真了,一个是说的人当真了"); System.out.println("-----------------------"); Consumer con2 = (s) ->{ //变化 System.out.println("s"); }; con2.accept("一个是听的人当真了,一个是说的人当真了"); //-------------------------------------------- ArrayList list = new ArrayList<>(); //类型推断int[] arr1 = new int[]{1,2,3}; int[] arr2 = {1,2,3}; //类型推断 }//语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略 @Test public void test4(){ Consumer con1 = (s) ->{ //变化 System.out.println("s"); }; con1.accept("一个是听的人当真了,一个是说的人当真了"); System.out.println("-----------------------"); Consumer con2 = s ->{ //变化 System.out.println("s"); }; con2.accept("一个是听的人当真了,一个是说的人当真了"); }//语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值 @Test public void test5(){Comparator com1 = new Comparator() { @Override public int compare(Integer o1, Integer o2) { System.out.println(o1); System.out.println(o2); return o1.compareTo(o2); } }; System.out.println(com1.compare(12,21)); System.out.println("-----------------------"); Comparator com2 = (o1,o2) -> { System.out.println(o1); System.out.println(o2); return o1.compareTo(o2); }; System.out.println(com2.compare(12,21)); }//语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略 @Test public void test6(){ Comparator com1 = (o1,o2) -> { return o1.compareTo(o2); }; System.out.println(com1.compare(12,21)); System.out.println("-----------------------"); Comparator com2 = (o1,o2) -> o1.compareTo(o2); System.out.println(com2.compare(12,21)); } @Test public void Test7(){ Consumer con1 = s ->{ System.out.println("s"); }; con1.accept("一个是听的人当真了,一个是说的人当真了"); System.out.println("-----------------------"); Consumer con2 = s -> System.out.println("s"); con1.accept("一个是听的人当真了,一个是说的人当真了"); } }

函数式(Functional)接口
  • 只包含一个抽象方法的接口,称为函数式接口。
  • 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式
    抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽
    象方法上进行声明)。
  • 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检
    查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个
    接口是一个函数式接口。
  • 在java.util.function包下定义了Java 8 的丰富的函数式接口
//???????自定义函数式接口 @FunctionalInterface public interface MyInterface { void method1(); }

JavaSE|Day35.Java 8新特性: Lambda表达式、函数式接口
文章图片


    推荐阅读