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