Java iterable.forEach()和iterable.stream().forEach()之间的差异
看起来我可以直接在我的集合上调用Java iterable.forEach()和iterable.stream().forEach()之间的差异,java,lambda,java-8,java-stream,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可
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
调用将在整个迭代过程中保持其锁定。这将防止其他线程在迭代期间修改集合,确保迭代看到集合的一致视图,并防止ConcurrentModificationException
。(这也将防止其他线程在迭代期间读取集合。)流的情况并非如此。没有什么可以阻止在流操作期间修改集合,如果确实发生了修改,则结果是未定义的。“阻止其他线程修改它”-或者从中读取,当然?最后一点似乎暗示Stream.forEach
与Iterable.forEach
在允许修改流源方面形成了对比。我怀疑你是否有意暗示这一点!我当然不是有意暗示的!我想我应该澄清最后一点。