Lambda 表达式
Lambda 表达式的基础语法
Java8 中引入了一个新的操作符:->
该操作符称为箭头操作符或者 Lambda 操作符
Lambda 操作符将表达式拆分成两部分:
- 左侧:Lambda 表达式的参数列表
- 右侧: Lambda 表达式的"函数体" --> Lambda 体
语法格式 1:无参数,无返回值,且 Lambda 体中只有一条语句
() -> lambda 体
代码示例:
// 使用匿名内部类的方式
Runnable run = new Runnable() {
@Override
public void run() {
System.out.println("Hello world!");
}
}
r.run();
System.out.println("---------------------")
// 使用 Lambda 的方式
Runnable runa = () -> System.out.println("Hello runnable!");
runa.run();
语法格式 2:有一个参数,无返回值,且 Lambda 体中只有一条语句
(x) -> Lambda 体
代码示例:
Consumer<String> consumer = (str) -> System.out.println(str);
consumer.accept("Hello world!");
语法格式 3:如果只有一个参数,无返回值,且 Lambda 体中只有一条语句,小括号可以省略不写
x -> Lambda 体
代码示例:
Consumer<String> consumer = str -> System.out.println(str);
consumer.accept("Hello world!");
语法格式 4:如果有两个及以上的参数,有返回值,且 Lambda 体中有多条语句
(x, y) -> { 表达式 1; 表达式 2; ...; return y - x; }
代码示例:
Comparator<Integer> comparator = (x, y) -> {
System.out.println("x = " + x);
System.out.println("y = " + y);
return y - x;
}
语法格式 5:如果有两个及以上的参数,但是 Lambda 体中只有返回值一条语句,则 return 和 {} 都可以不写
(x, y) -> y - x
代码示例:
Comparator<Integer> comparator = (x, y) -> y - x;
语法格式 6: Lambda 表达式的参数列表的数据类型可以省略不写,因为 JVM 编译器会通过上下文进行推断,即“类型推断”
Lambda 表达式需要“函数式”接口的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口,可以使用 @FunctionalInterface 注解来进行标注
Java8 内置的四大核心函数式接口
Consumer :消费型接口 --> 一般用于消费传入的数据
void accept(T t);
Supplier : 供给型接口 --> 一般用于提供数据
T get();
Function<T, R> : 函数型接口 --> 一般用于对传入的数据进行处理,并返回处理后的结果
R apply(T t);
Predicate : 断言型接口 --> 一般用于判断传入的数据是否符合条件
boolean test(T t);