【问题标题】:Java 8 Collection and stream/forEachJava 8 集合和流/forEach
【发布时间】:2016-10-05 18:25:27
【问题描述】:

在使用 Collection 时,是否有任何理由在 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?

谢谢

【问题讨论】:

  • 只有在使用parallelStream()parallel() 时才会并行调用forEach。如果这样做,您必须确保Consumer 不会更改任何内容或者是线程安全的。
  • 流上的 forEach 具有不同的语义,因为它与集合上的 forEach 不同,它不保证保持元素顺序,并且在并行流的情况下,将调用操作而不任何同步。 forEachOrdered 更像Collection.forEach,但在没有任何其他流操作的情况下没有任何意义。
  • 另一个区别是 Collection.forEach 对修改底层集合更加宽容。

标签: java java-8 java-stream


【解决方案1】:
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。循环很可能会改变流外部的数据。

【讨论】:

    【解决方案2】:

    它做同样的工作,但是范式完全不同。

    Streams 是 函数式编程 的一部分,它可以让您思考要做什么而不是如何做。

    我知道这听起来可能很抽象,但确实很有意义。所以基本上你专注于操作而不是迭代。更不用说 stream() 为您提供了额外的功能,如过滤器、映射、减少......

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

    【讨论】:

    • 这就是我要问的。如果我明确地说是 parallelStream(),当集合调用 forEach 时,会不会有性能差异,或者会在后台得到解释?
    猜你喜欢
    • 1970-01-01
    • 2014-10-10
    • 2017-08-08
    • 2018-11-19
    • 1970-01-01
    • 2022-06-18
    • 2015-06-29
    • 2015-10-20
    • 2014-05-04
    相关资源
    最近更新 更多