Stream.reduce始终保持并行,无序流的顺序

Geo*_*sty 6 java sorting reduce java-8 java-stream

我已经通过像前几次问题了在Java流相遇为了保鲜这个答案Brian Goetz撰写,还有的javadoc的Stream.reduce(),和java.util.stream包的javadoc,但我仍然可以” t掌握以下内容:

采取这段代码:

  public static void main(String... args) {
    final String[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
    System.out.println("Alphabet: ".concat(Arrays.toString(alphabet)));
    System.out.println(new HashSet<>(Arrays.asList(alphabet))
          .parallelStream()
          .unordered()
          .peek(System.out::println)
          .reduce("", (a,b) -> a + b, (a,b) -> a + b));
  }
Run Code Online (Sandbox Code Playgroud)

为什么减少总是*保留相遇顺序?

  • 到目前为止,经过几十次运行,输出是相同的

Eug*_*ene 5

首先,这unordered并不意味着实际的洗牌;它所做的只是为 Stream 管道设置一个标志 - 稍后可以利用该标志。

源元素的洗牌可能比流管道本身的操作昂贵得多,因此实现可能选择不这样做(就像在本例中一样)。

目前(经过测试并查看了来源)jdk-8jdk-9-reduce没有考虑到这一点。请注意,这很可能在未来的版本或版本中发生变化。

另外,当您说unordered- 您实际上意味着您不关心该顺序并且返回相同结果的流并不违反该规则。

例如,请注意这个 问题/答案,它解释了findFirst例如(只是另一个终端操作)更改为unordered在 java-9 中考虑而不是在 java-8 中考虑。