Java Lambda 表达式

2025 年 4 月 21 日 | 阅读 11 分钟

Lambda 表达式是 Java SE 8 中引入的一项新且重要的特性。它提供了一种清晰简洁的方式,通过表达式来表示一个方法接口。它在集合库中非常有用。它有助于迭代、过滤和提取集合中的数据。

Lambda 表达式用于为具有函数式接口的接口提供实现。它节省了大量的代码。在 Lambda 表达式的情况下,我们不需要再次定义方法来提供实现。在这里,我们编写实现代码。

Java Lambda 表达式被视为一个函数,因此编译器不会创建 .class 文件。

函数式接口

Lambda 表达式提供了函数式接口的实现。只有一个抽象方法的接口称为函数式接口。Java 提供了一个注解 @FunctionalInterface,用于将接口声明为函数式接口。

为什么要使用 Lambda 表达式?

Java 中的 Lambda 表达式有助于更简洁、更具表现力地实现函数式接口,从而消除冗长的模板代码并增强可读性。这个新库将函数式编程风格引入 Java,并将函数视为一流公民。Lambda 表达式独特地允许以函数式风格操作流集合,语法也得到了简化。

它们的灵活性在需要容器化行为并将其作为参数以便于模块化和易于维护的情况下也很明显。Lambda 表达式有助于提供匿名类的更紧凑的替代方案,从而简化代码并减少冗余。

此外,它们促进了并行编程结构的实现,并且总的来说,通过整洁、无错误的编码实践为消除 bug 提供了空间。

Java Lambda 表达式语法

Java Lambda 表达式由以下三个部分组成:

  1. 参数列表:它可以是空的,也可以是非空的。
  2. 箭头符号:它用于链接参数列表和表达式的体。
  3. 体:它包含 Lambda 表达式的表达式和语句。

无参数语法

单参数语法

双参数语法

让我们看一个不使用 Java Lambda 表达式实现的场景。在这里,我们将在不使用 Lambda 表达式的情况下实现一个接口。

没有 Lambda 表达式的接口

示例

编译并运行

输出

Drawing 10

Java Lambda 表达式示例

现在,我们将使用 Java Lambda 表达式来实现上述示例。

示例

输出

Example 1: Using forEach
1 2 3 4 5 6 7 8 9 10 
Example 2: Using map and reduce
Sum of squares: 385
Example 3: Using filter
Even numbers: [2, 4, 6, 8, 10]

Lambda 表达式可以具有零个或任意数量的参数。让我们看一些例子。

Java Lambda 表达式示例:无参数

示例

编译并运行

输出

I have nothing to say.

Java Lambda 表达式示例:单参数

示例

编译并运行

输出

Hello, Sonoo
Hello, Sonoo

Java Lambda 表达式示例:多参数

示例

编译并运行

输出

Average: 20.0

Java Lambda 表达式示例:带 return 关键字

在 Java Lambda 表达式中,如果只有一个语句,你可以使用 return 关键字,也可以不使用。当 Lambda 表达式包含多个语句时,你必须使用 return 关键字。

示例

编译并运行

输出

30
300

Java Lambda 表达式示例:不带 return 关键字

示例

编译并运行

输出

Result of addition: 12

Java Lambda 表达式示例:foreach 循环

示例

编译并运行

输出

ankit
mayank
irfan
jai

Java Lambda 表达式示例:多个语句

示例

编译并运行

输出

I would like to say, time is precious.

Java Lambda 表达式示例:创建线程

你可以使用 Lambda 表达式来运行线程。在下面的示例中,我们使用 Lambda 表达式实现了 run 方法。

示例

编译并运行

输出

Thread1 is running...
Thread2 is running...

Java Lambda 表达式可用于集合框架。它提供了一种高效且简洁的方式来迭代、过滤和获取数据。以下是一些 Lambda 和集合示例。

Java Lambda 表达式示例:比较器

示例

编译并运行

输出

Sorting on the basis of name...
2 Dell Mouse 150.0
1 HP Laptop 25000.0
3 Keyboard 300.0

Java Lambda 表达式示例:过滤集合数据

示例

编译并运行

输出

Iphone 6S: 65000.0
Sony Xperia: 25000.0
Redmi4 : 26000.0

Java Lambda 表达式示例:事件监听器

示例

输出

Java Lambda Event Handling Example

Lambda 表达式的优点

1. 可读性和简洁性

Lambda 表达式提供的更简洁的语法使编写匿名函数更加容易。这会产生更易于阅读和维护的代码,尤其是在使用函数式接口时。

2. 支持函数式编程

Lambda 表达式促进了 Java 中函数式编程范式的采用。它们通过允许使用函数式接口以及集成 reduce、filter 和 map 等函数式工具,使代码更具表现力和函数性。

3. 并行性和并发性

Lambda 表达式在处理这两个概念时尤其有用。它们可以轻松地使用 Streams API 在集合上执行并发操作。

4. 行为封装

Lambda 表达式提供了一种便携且简洁的方式来表示行为。它们通过允许将行为作为参数传递给方法,提高了编程的模块化和灵活性。

5. 更好的集合迭代

通过消除模板代码并简化集合的迭代,Lambda 表达式提高了代码的可读性。

Lambda 表达式的缺点

1. 仅限于函数式接口

Lambda 表达式仅适用于函数式接口,后者仅包含一个抽象方法。此限制使其仅适用于特定场景,如果您需要与包含多个抽象方法的接口进行交互,这可能会有问题。

2. 复杂推理的可读性问题

Lambda 表达式对于简短、简单的过程很有用,但当应用于更复杂的推理时,它们可能会变得不那么易读。在某些情况下,使用其他类或更传统的方法可能更合适。

3. 调试

Lambda 表达式可能难以调试,特别是当它们很复杂或包含多个抽象级别时。堆栈跟踪有时无法精确定位 Lambda 表达式中问题的确切位置。

4. 状态管理困难

Lambda 表达式没有状态,是无状态的。因此,处理可变状态和捕获封闭范围的变量可能会很困难,尤其是在处理并发或并行流时。

5. 特定情况下的性能开销

尽管 Lambda 表达式已针对现代 Java 运行时系统进行了优化,但在某些情况下,使用 Lambda 表达式可能会导致轻微的性能开销。虽然这通常对大多数应用程序无关紧要,但在性能至关重要的情况下应予以考虑。


Java Lambda 表达式选择题

1. Lambda 表达式在 Java 中的一个关键特性是什么?

  1. 它们主要用于异常处理。
  2. 它们通过允许将函数作为参数传递来实现函数式编程。
  3. 它们用于对象序列化。
  4. 它们取代了所有匿名内部类。
 

答案:B

解释: Lambda 表达式通过允许将函数作为参数传递,使 Java 代码更简洁、更具可读性,从而实现函数式编程。


2. Lambda 表达式必须实现哪个接口?

  1. Serializable
  2. Runnable
  3. FunctionalInterface
  4. Cloneable
 

答案:C

解释: Lambda 表达式必须实现一个函数式接口,即只有一个抽象方法的接口。


3. 如何在 Java 中表示 Lambda 表达式 (int x, int y) -> x + y?

  1. 作为方法引用
  2. 作为匿名类
  3. 作为函数式接口实现
  4. 作为 Lambda 表达式
 

答案:D

解释: 表达式 (int x, int y) -> x + y 是一个 Lambda 表达式,它接受两个整数参数并返回它们的和。


4. 哪个 Java 包包含与 Lambda 表达式一起使用的 Function 接口?

  1. java.lang
  2. java.util
  3. java.util.function
  4. java.io
 

答案:C

解释: Function 接口以及与其他 Lambda 表达式一起使用的功能性接口都包含在 java.util.function 包中。


5. 以下 Lambda 表达式的作用是什么:() -> System.out.println("Hello")?

  1. 它定义了一个 Runnable 接口。
  2. 它创建了一个线程。
  3. 调用时会打印 "Hello"。
  4. 它返回字符串 "Hello"。
 

答案:C

解释: Lambda 表达式 () -> System.out.println("Hello") 是一个无参数表达式,调用时会打印 "Hello"。