为什么并行流只会在其中一个(而不是两个)流是无序的,或者收集器是UNRDERED的情况下执行并行缩减



我很难理解Java文档中提到的规则(https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html)与平行流有关,陈述";只有在以下情况下,Stream.collect(收集器)实现才会执行并发缩减:1.2.3.流是无序的,或者收集器具有Collector.Characterics.unordered特性"我们有四种情况:

  1. 两者都是有序的,这显然不会利用并行还原的优势
  2. 两者都是无序的,这显然会利用并发减少的优势
  3. 流是无序的,收集器是有序的,这显然也将利用并发减少的优势
  4. 流是有序的,收集器是无序的,这符合第三个条件,应该利用并发减少的优势。然而,我所理解的是,对并行线程的输出进行排序以保持流有序的主要责任在于流本身(对并行流线程的输出重新排序的责任在于流),这意味着(在我的理解中)无论收集器的特性如何(有序或非有序),性能都会受到此步骤的影响。流将负责重新排序输出并降低性能,然后,收集器将在不影响性能的情况下存储来自流的输入

因此,第三个条件或规则应该是";它们都是无序的";或";流是无序的";。我知道我的逻辑有问题,但我在互联网上找不到任何解释这一点的澄清。有谁能解释一下我理解中的错误吗?

我在互联网上搜索了答案,我试着问了chatGPT(它在学习btw方面非常有用),但没有得到令人满意的答案。

收集器不是流管道的独立部分。流知道收集器的情况,可以适当地更改其行为。想想forEach()forEachOrdered()。当在并行流(好吧,技术上是任何流)上调用时,forEach()不保证排序,尽管流本身是有序的。相反,如果流本身没有相遇顺序,则forEachOrdered()不能做出任何排序保证。只有当使用与有序流相结合的有序终端操作时,才必须顺序处理元素。收藏者也是如此。

收集器具有收集器。特征。NORDERED特征:

该特性的描述为

表示集合操作不致力于保留输入元素的相遇顺序。(如果结果容器没有内在的顺序,比如Set,这可能是真的。)

如果collect操作的结果没有内在顺序,则Stream.collect()操作不需要保留流中存在的任何顺序(因为该顺序无论如何都会在结果中丢失),因此它可以使用并发减少(这可能会丢失该顺序)。