Java8新特性之Lambda表达式
1、Lambda 的基本介绍
Lambda Java8 的新特性之一,Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
在JDK8之前,Java是不支持函数式编程的,所谓的函数编程,即可理解是将一个函数(也称为“行为”)作为一个参数进行传递。通常我们提及得更多的是面向对象编程,面向对象编程是对数据的抽象(各种各样的POJO类),而函数式编程则是对行为的抽象(将行为作为一个参数进行传递)。在JavaScript中这是很常见的一个语法特性,但在Java中将一个函数作为参数传递这却行不通,好在JDK8的出现打破了Java的这一限制。
2、Lambda 的语法
Lambda 表达式在Java 语言中引入了一个新的操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或剪头操作符。
Lambda 操作符 -> 将 Lambda 分为了两个部分:
- 左侧: 指定了 Lambda 表达式需要的所有参数
- 右侧: 指定了 Lambda 体,即 Lambda 表达式要执行的功能。
各种情况语法格式说明:
- 无入参,无返回值:
Runnable r1 = () -> System.out.println("Hello Lambda!");
- 有一个入参,无返回值:
Consumer<String> con = (x) -> System.out.println(x); Consumer<String> con = x -> System.out.println(x); //只有一个参数,此时参数的小括号可以省略掉
- 有两个入参,并且有返回值
Comparator<Integer> com = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); };
当 Lambda 体只有一条语句时,return 与大括号都可以省略,Lambda 会自动将操作符右侧的值进行返回
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
Lambda 表达式的参数列表的数据类型也可以省略不写,因为JVM编译器会通过上下文自动推断出数据类型,即“类型推断”
Comparator<Integer> com = ( Integer x, Integer y) -> { //Integer 类型可以省略 System.out.println("函数式接口"); return Integer.compare(x, y); };
类型推断:Lambda 表达式中的参数类型都是由编译器推断 得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断”