📅  最后修改于: 2023-12-03 15:31:28.185000             🧑  作者: Mango
Lambda 表达式是 Java 8 中引入的一个重要特性,它可以以更简洁、更优雅的方式来实现函数式编程。Lambda 表达式是匿名函数,它没有名称,但具有参数列表、函数体和可能的返回类型,可以作为一个变量、参数或返回值,被用于函数式编程。
Lambda 表达式的语法如下:
(parameters) -> { body }
其中:
parameters 是参数列表,如果有多个参数,使用逗号进行分隔。
-> 是 Lambda 操作符,读作“goes to”。
body 是函数体,可以是一个语句块,也可以是一个表达式。
例如,下面是一个接收两个整数并返回它们的和的 Lambda 表达式:
(int x, int y) -> { return x + y; }
由于 Lambda 表达式可以自动推断参数类型,所以也可以省略参数类型,如下所示:
(x, y) -> { return x + y; }
当参数只有一个时,可以省略括号,如下所示:
x -> { return x * x; }
如果函数体只有一个语句,可以省略大括号和 return,如下所示:
(x, y) -> x + y
在 Java 8 中,Lambda 表达式可以自动推断参数类型,例如:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
在上述代码中,names.forEach 方法接收了一个 Lambda 表达式作为参数,Lambda 表达式的参数类型会自动推断为 String 类型。
Lambda 表达式允许访问外部变量,这被称为“闭包”。例如:
int x = 10;
Runnable r = () -> {
System.out.println("x = " + x);
};
r.run();
在上述代码中,Lambda 表达式访问了外部变量 x,Lambda 表达式中的 x 是 final 类型。
Lambda 表达式可以引用方法,例如:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
在上述代码中,names.forEach 方法接收了一个方法引用作为参数,等价于:
names.forEach(name -> System.out.println(name));
Lambda 表达式只能用于函数式接口(Functional Interface),函数式接口是只包含一个抽象方法的接口。例如,下面是一个函数式接口:
@FunctionalInterface
interface MyComparator<T> {
int compare(T o1, T o2);
}
函数式接口可以用于 Lambda 表达式,例如:
MyComparator<Integer> c = (x, y) -> x.compareTo(y);
Lambda 表达式的应用非常广泛,包括集合框架、并发编程、GUI 开发等。例如,下面是一个使用 Lambda 表达式进行多线程并发编程的例子:
IntStream.range(1, 11).parallel().forEach(System.out::println);
在上述代码中,IntStream.range(1, 11) 生成了 1 到 10 的数字流,parallel() 方法将流变成并行流,forEach 方法接收了一个 Lambda 表达式作为参数,用于输出数字。由于使用了并行流,输出结果不一定是按顺序的。