java - iterable.forEach() 和 iterable.stream().forEach() 的区别

标签 java lambda java-8 java-stream

<分区>

看起来我可以直接在我的集合上调用 list.forEach(a -> a.stuff()),而不是 list.stream().forEach(a -> a.stuff())。我什么时候会使用一个而不是另一个(parallelStream() 除了..)?

最佳答案

有一些区别:

Iterable.forEach 保证按迭代顺序处理,如果它是为 Iterable 定义的。 (迭代顺序通常为列表明确定义。)Stream.forEach 没有;必须改用 Stream.forEachOrdered

Iterable.forEach 可能允许对底层数据结构产生副作用。尽管许多集合的迭代器会在迭代期间修改集合时抛出 ConcurrentModificationException,但某些集合的迭代器明确允许这样做。例如,参见 CopyOnWriteArrayList。相比之下,流操作通常不能干扰流源。

如果 Iterable 是一个同步包装器集合,例如,来自 Collections.synchronizedList(),对其调用 forEach 将在整个迭代期间保持其锁定.这将防止其他线程在迭代期间修改集合,确保迭代看到集合的一致 View ,并防止 ConcurrentModificationException。 (这也将防止其他线程在迭代期间读取集合。)流不是这种情况。没有什么可以阻止集合在流操作期间被修改,如果确实发生修改,结果是不确定的。

关于java - iterable.forEach() 和 iterable.stream().forEach() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23954702/

相关文章:

C# Lambda 忽略大小写

java - Orika 使用 BoundMapperFacade 而不是 MapperFacade

java - 按给定顺序从 pojo 填充列表

java - "if else"中的 break 语句 - java

java - 如何找出 EnumMap 中使用的枚举?

java - 注释 Lambda 表达式的功能接口(interface)

java - 如何找到 List<E> 中的最小值?

java - 使用 java 8 和格式将字符串转换为日期 -> 'uuuu-MM-dd'

java - 根据组计数分隔行 - TALEND

java - Android中如何处理AffineTransform?