Java 8 集合和流/forEach

3

在使用集合时,在forEach调用之前是否有特定插入流/并行流的原因?

示例:

Collection<Object> foo;
foo.forEach(); // Goes through every item in foo
foo.stream().forEach(); // Does stream make a difference here
foo.parallelStream().forEach(); // Does this make a difference here?

谢谢


1
如果你使用parallelStream()或者parallel(),那么forEach方法就会以并行的方式执行。然而,你必须确保传入Consumer函数不会修改任何数据或者是线程安全的。 - Peter Lawrey
2
在流上使用forEach与在集合上使用不同,它不能保证维护元素顺序,并且在并行流的情况下,将在没有任何同步的情况下调用操作。 forEachOrdered更像是Collection.forEach,但在没有任何其他流操作的情况下没有意义。 - Holger
另一个区别是,Collection.forEach 更容易修改底层集合。 - Hank D
2个回答

4
foo.forEach(); // Goes through every item in foo
foo.stream().forEach(); // Does stream make a difference here

除非需要流操作(如map或filter),否则它就是无用的。

foo.parallelStream().forEach();

这将为计算机的每个逻辑内核生成一个新线程来计算项目。请三思而后行,是否使用此功能,在大多数情况下,它只在长时间运行的操作中产生回报。
底线:流真正发挥作用的时候是在没有副作用的情况下使用,例如将类型A的集合映射到类型B,而不会改变A。循环最有可能会改变流之外的数据。

0

它完成相同的工作,但范式完全不同。

流是函数式编程的一部分,它让你以做什么而不是如何做为思考方式。

我知道这听起来抽象,但它确实有意义。所以基本上你关注操作而不是迭代。更不用说stream()提供了额外的功能,比如过滤、映射、归约...

并行流将使您使用所有核心,这非常酷 - 您将拥有一个真正的多线程应用程序,而无需额外的代码。


这就是我所问的。如果我明确地说parallelStream(),那么是否会有性能差异,或者当集合调用forEach时,它会在幕后进行解释? - ekjcfn3902039

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接