Stream.sorted()然后收集,或收集List.sort()?

Ale*_*ica 7 java sorting list java-stream collectors

一般来说,这两段代码之间是否存在性能差异?

List<Integer> list1 = someStream1.sorted().collect(toList());
// vs.
List<Integer> list2 = someStream2.collect(toList());
list2.sort(Comparator.naturalOrder())
Run Code Online (Sandbox Code Playgroud)

变体2显然是令人讨厌的,应该避免,但我很好奇是否在Stream 的主流(heh,main stream)实现中内置了任何性能优化,这将导致这两者之间的性能差异.

我想,因为流有关于情况的更多信息,所以它将有更好的优化机会.例如,我想如果这个问题得到了findFirst()解决,那么它就会忽略这种操作,而不是min操作.

Gho*_*ica 4

两种选择都应产生相同的最终结果。但运行时特征可能有所不同。如果初始流是并行流怎么办?那么选项 1 将进行并行排序,而选项 2 不会进行“顺序”排序。结果应该是相同的,但总体运行时间不同。那么 CPU 负载可能会有很大不同。

我肯定更喜欢选项 1 而不是 2:为什么先创建一个列表,然后对其进行排序?!

想象一下,例如您稍后想要收集到一个不可变列表中。那么遵循第二个模式的所有代码都会被破坏。而使用模式 1 编写的代码根本不会受到影响!

当然,在这里的示例中这不应该导致问题,但是如果 sort() 发生在稍微不同的地方怎么办?!

  • 如果流可以支持排序和收集到不可变列表中,这是否意味着流有自己的暂存缓冲区,在其中进行排序,然后必须进行复制? (2认同)