Java 中 Collection.stream().forEach() 和 Collection.forEach() 之间的区别

2025年6月16日 | 阅读 4 分钟

Collection.forEach()和Collection.stream().forEach()都用于遍历集合,它们之间没有显著的区别。两者之间没有大的区别,因为它们都提供相同的结果。然而,有一些。

Collection.stream().forEach() 方法

通过将集合转换为流,然后使用Collection.stream().forEach()遍历集合流来本质上完成对象组的迭代。如果在迭代过程中对集合进行任何结构性更改,将引发并发修改异常。

通过Collection.stream().forEach()方法可以在Java中遍历集合的成员,该方法支持函数式操作。当与并行流结合使用时,它会并行处理组件,因此适用于需要速度优化的庞大数据集,而Collection.forEach()直接对集合执行操作,stream().forEach()首先将集合转换为流,然后执行操作。

该方法经常用于Java的Stream API中的数据转换、过滤和并行处理。

示例

编译并运行

输出

 
20406080  

Collection.forEach() 方法

Collection.forEach() 使用集合的迭代器(无论提供什么)。在遍历集合时,大多数集合不允许结构性更改。如果对集合进行任何修改,例如添加或删除条目,将引发并发修改错误。在遍历同步集合时,collection.forEach() 会锁定集合段,并在所有可能的调用该集合时持有该段。

Collection.forEach() 方法(Java 8中引入)提供了一种清晰有效的方式来遍历集合的组件。由于它是Iterable接口的一部分,并接受一个Consumer函数式接口作为参数,因此可以与lambda表达式或方法引用一起使用。与stream().forEach()不同,它直接与集合一起工作,而无需将其转换为流。

此技术提供了一种清晰易懂的方式来处理和导航列表、集合和其他类型集合中的元素。

示例

编译并运行

输出

 
20406080  

Collection.stream().forEach() 和 Collection.forEach() 的比较

Collection.stream().forEach()Collection.forEach()
Collection.stream().forEach() 也用于集合迭代;然而,它不是直接遍历集合流,而是先将集合转换为流。Collection.forEach() 使用集合的迭代器。
与Collection.forEach()相比,它不按预定的顺序运行;也就是说,顺序未定义。如果提供了可迭代对象,它将始终按该顺序执行。
如果集合的结构发生变化,异常将稍后抛出。如果在修改过程中集合发生任何结构性变化,Collection.forEach()将立即抛出异常。
如果正在遍历同步集合,则它不会对集合进行锁定。如果迭代正在跨同步集合运行,那么它会锁定集合并在所有调用中持有它。

Collection.stream().forEach() 和 Collection.forEach() 选择题

1. ______________________ 用于遍历集合,但它首先将集合转换为流,然后遍历集合流。

  1. Collection.stream().forEach()
  2. Collection.forEach()
  3. Collection.stream().forEach() 和 Collection.forEach() 都
 

答案: a)

解释: Collection.stream().forEach() 用于集合迭代;然而,它不是直接遍历集合流,而是先将集合转换为流。


2. 在集合结构修改期间,异常将在 _________________ 中稍后抛出。

  1. Collection.stream().forEach()
  2. Collection.forEach()
  3. Collection.stream().forEach() 和 Collection.forEach() 都
 

答案: a)

解释: 如果集合的结构发生变化,异常将在 Collection.stream().forEach() 中稍后抛出。


3. 在 ____________ 中,不定义执行的特定顺序。

  1. Collection.forEach()
  2. Collection.stream().forEach()
  3. do-while 循环
  4. 以上全部
 

解释: 与Collection.forEach()不同,Collection.stream().forEach()不按预定的顺序运行;也就是说,顺序未定义。


4. _______________ 使用集合的迭代器。

  1. Collection.stream().forEach()
  2. Collection.forEach()
  3. do-while 循环
 

答案: b)

解释: Collection.forEach() 使用集合的迭代器。


5. 选择错误的陈述。

  1. 在集合结构修改期间,异常将在 Collection.stream().forEach() 中稍后抛出。
  2. 在集合结构修改期间,异常将在 Collection.forEach() 中稍后抛出。
  3. 如果正在遍历同步集合,那么 Collection.stream().forEach() 不会对集合进行锁定。
  4. 如果迭代正在跨同步集合运行,那么 Collection.forEach() 会锁定集合并在所有调用中持有它。
 

答案: b)

解释: 在集合结构修改期间,Collection.forEach()将立即抛出异常。