java for foreach区别_java – Collection.stream() forEach()和Collection.forEach()之间有什么区别?...

对于诸如所示的简单情况,它们大部分是相同的。然而,有一些细微的差异可能是重要的。

一个问题是订购。使用Stream.forEach,顺序是未定义的。它不可能发生在顺序流,仍然,在Stream.forEach的规范以一些任意顺序执行。这在并行流中经常发生。相比之下,Iterable.forEach总是在Iterable的迭代顺序中执行,如果指定了一个。

另一个问题是副作用。 Stream.forEach中指定的操作需要是无干扰的。 (见java.util.stream package doc.)Iterable.forEach可能有较少的限制。对于java.util中的集合,Iterable.forEach通常使用该集合的Iterator,其中大部分设计为fail-fast,如果集合在迭代期间被结构化修改,则会抛出ConcurrentModificationException。然而,在迭代期间允许不是结构的修改。例如,ArrayList class documentation说“仅设置元素的值不是结构修改”。因此,ArrayList.forEach的操作允许在底层ArrayList中设置值,而没有问题。

并发集合又是不同的。而不是故障快速,他们设计为weakly consistent.完全的定义是在那个链接。简而言之,请考虑ConcurrentLinkedDeque。允许传递给它的forEach方法的动作修改底层的deque,即使是在结构上,并且从不抛出ConcurrentModificationException。但是,发生的修改可能会或可能不会在此迭代中可见。 (因此“弱”一致性。)

如果Iterable.forEach在同步的集合上迭代,还有另一个区别是可见的。在这样的集合中,Iterable.forEach会获取集合的锁定一次,并保存在对action方法的所有调用中。 Stream.forEach调用使用集合的分割器,它不锁定,它依赖于主要的无干扰规则。支持流的集合可以在迭代期间修改,如果是,则可能导致ConcurrentModificationException或不一致的行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值