Java 8 引入新操作符:->
- 操作符左侧: Lambda 表达式的参数列表
- 操作符右侧: Lambda 表达式所需执行的功能,即 Lambda 体
函数接口
函数接口是只有一个抽象方法的接口,Lambda 表达式使用函数接口。
多抽象方法的接口,并不能使用 Lambda 表达式。
Java 8 java.util.function 包下定义了一些函数接口:
1 | public interface Predicate<T> { |
而且很多原接口都继承了这些函数接口
函数接口可以使用 @FunctionalInterface 注解修饰
使用 @FunctionalInterface 修饰的接口必须是函数接口
Lambda 表达式语法格式
无参 无返回值
Lambda 表达式不包含参数,使用空括号 () 表示没有参数:
1 | Runnable runnable = () -> System.out.println("Hello Lambda!"); |
一个参数 有返回值
1 | Consumer<String> consumer = (x) -> System.out.println(x); |
Lambda 表达式包含且只包含一个参数,可以省略参数的括号
1 | Consumer<String> consumer = x -> System.out.println(x); |
表达式是代码块
1 | Runnable runnable = () -> { |
如果 Lambda 表达式是一段代码块,则必须使用大括号包裹代码块
多参数,有返回值
1 | Comparator<Integer> comparator = (x, y) -> { |
如果表达式只有一条语句,大括号和 return 可以省略
1 | Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y); |
显式声明参数类型
1 | Comparator<Integer> comparator = (Integer x, Integer y) -> Integer.compare(x, y); |
引用值
在 Java 7 时,匿名内部类需要使用外部变量,外部变量需要 final 修饰。
在 Java 8 时,虽然无须显式声明为 final, 但默认还是 fianl 的。
同理 Lambda 表达式引用的也是事实上 final 修饰的变量
类型推断
Java 7 就引入了目录类型推断:
1 | List<String> strList = new ArrayList<>(8); |
Java 8 中对类型推断进一步升级:编译器可以根据上下文进行推断
若推断不出,编辑期会报错。