Java 8 forEach() 方法

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

Java 8 中的 `forEach()` 方法是一种简单的方式来遍历集合,从而使函数式编程范例更接近 Java 程序员。它是 `Iterable` 接口的成员,接受一个 `Consumer` 函数式接口作为输入。这使得编程简洁明了,因为不需要传统的循环中的样板代码。继承了 `Iterable` 接口的集合类都可以使用 `forEach` 循环来遍历元素。

此方法接受一个参数,该参数是一个函数式接口。因此,我们可以将 lambda 表达式作为参数传递。

`Iterable` 接口中的 `forEach()` 签名

default: 此关键字的存在意味着该方法在该接口中具有默认实现。为了解决接口方法默认实现破坏现有代码的问题,Java 8 引入了所谓的默认方法。

void: 它表示方法的返回类型。在这里,`forEach` 不提供任何值。实际上,它对集合中的每个元素执行一个操作。

forEach: 这是方法的名称。这表明它作为一个循环运行,集合的每个元素都用于执行特定操作。

(Consumer<? super T> action): 这部分说明了方法的参数。参数是 `Consumer` 接口类型,它位于 `java.util.function` 包中。函数式接口是只提供一个抽象方法的接口。`Consumer` 接口表示一个操作数,其操作只需要一个输入参数且不返回任何输出。

在这里,输入参数中的 T 代表集合中对象的类型。<? 首先,超类型边界允许 `consumer` 解释提供的 T 的任何超类,这使得对元素可以执行的操作类型变得灵活。

相比传统循环的优点

  • 与典型循环相比,`forEach` 的主要优点是其简洁性和易懂性。虽然 lambda 表达式用于包含迭代逻辑,但它有助于减轻开发人员的思考负担,从而使代码易于理解和维护。
  • 此外,`forEach` 通过可变性和方面分离的事实,增强了更函数式的编码方式。这种策略符合当前软件工程实践,能够创建更整洁、更模块化的代码。

Java 8 forEach() 示例 1

ForEachExample.java

输出

------------Iterating by passing lambda expression--------------
Football
Cricket
Chess
Hocky

Java 8 forEach() 示例 2

ForEachExample.java

输出

------------Iterating by passing method reference---------------
Football
Cricket
Chess
Hocky

Java Stream `forEachOrdered()` 方法

Java 流中的 `forEachOrdered()` 方法与 `forEach()` 方法类似。它按照流的遇到顺序对流中的每个元素执行提供的操作。但是,与允许无序并行执行的 `forEach()` 不同,`forEachOrdered()` 保证元素按照流指定的顺序处理。

签名

(Consumer<? super T> action) 是 `forEachOrdered` 方法的参数。它接受 `Consumer` 函数式接口的实例。

consumer 是 `java.util.function` 包中定义的函数式接口。它表示一个接受单个输入参数而不返回任何结果的操作。

<? super T> 是一个通配符边界,它允许 `Consumer` 接受 T 的任何超类,从而为可以对流元素执行的操作类型提供了灵活性。

action 是参数的名称,它表示要对流中的每个元素执行的操作。调用 `forEachOrdered` 方法时,此操作由用户指定。

用法:这种方法通常利用流来处理来自每个流的项目并保持遇到顺序。对于有序流或处理顺序很重要的序列,它是一种非常有效的逻辑运算符。

遇到顺序:例如,流的遇到顺序描述了流元素在处理过程中如何被遇到。对于有序流,例如来自列表和数组的流,遇到顺序与源集合的迭代顺序相同。对于无序流或从集合创建的流,遇到顺序将是未定义或不重复的。

顺序流与并行流:当涉及到流时,`forEachOrdered()` 保证操作将根据遇到顺序对每个项目执行,而与并行性无关。值得一提的是,虽然 `forEach()` 允许松散的并行执行,其中元素顺序是非确定性的,但 `for` 循环确保逻辑顺序执行。

Java Stream `forEachOrdered()` 方法示例

Java Stream `forEachOrdered()` 方法示例

输出

------------Iterating by passing lambda expression---------------
Football
Cricket
Chess
Hocky
------------Iterating by passing method reference---------------
Football
Cricket
Chess
Hocky