📜  Java 8 中的 Lambda 表达式(1)

📅  最后修改于: 2023-12-03 15:31:28.185000             🧑  作者: Mango

Java 8 中的 Lambda 表达式

介绍

Lambda 表达式是 Java 8 中引入的一个重要特性,它可以以更简洁、更优雅的方式来实现函数式编程。Lambda 表达式是匿名函数,它没有名称,但具有参数列表、函数体和可能的返回类型,可以作为一个变量、参数或返回值,被用于函数式编程。

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
Lambda 表达式的特性
类型推断

在 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 表达式的应用

Lambda 表达式的应用非常广泛,包括集合框架、并发编程、GUI 开发等。例如,下面是一个使用 Lambda 表达式进行多线程并发编程的例子:

IntStream.range(1, 11).parallel().forEach(System.out::println);

在上述代码中,IntStream.range(1, 11) 生成了 1 到 10 的数字流,parallel() 方法将流变成并行流,forEach 方法接收了一个 Lambda 表达式作为参数,用于输出数字。由于使用了并行流,输出结果不一定是按顺序的。

参考资料