Java8 之 Lambda表达式
Java8 中的 Lambda表达式 需要“函数式”接口的支持;
1.函数式接口
函数式接口 :只有一个抽象方法的接口;
1.1 常用的函数式接口
- 消费型接口:Consumer
void accept(T t);
- 供给型接口:Supplier
T get();
- 函数型接口:Function<T, R>
R apply(T t);
- 断言型接口:Predicate
boolean test(T t);
其他函数式接口可在 java.util.function 包中获取学习;
1.2 自定义函数式接口
@FunctionalInterface
public interface XXX<T , ...> {
XXX xxx(T t , ...);
}
注意:
- 使用 @FunctionalInterface 标识类,表示这是一个函数式接口,内部只能存在一个抽象方法;
2.Lambda表达式
结构 : (…) -> {…}
-> Lambda操作符 (或称为 剪刀操作符 )
左边 入参
右边 Lambda 体,即 Lambda 表达式要执行的功能
2.1 案例
Consumer
Supplier
Function<String, String> function = (t) -> t + “world”;
Predicate
3.类型推断
Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。
注意:
- Lambda表达式 与 函数式接口 中的方法,入参和出参都是一一对应的;
- 左边只有一个入参时,() 可以不写;
- 右边代码块只有一句时,{} 可以不写;
- 入参的类型是由JVM自动推断得到的;