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操作.
两种选择都应产生相同的最终结果。但运行时特征可能有所不同。如果初始流是并行流怎么办?那么选项 1 将进行并行排序,而选项 2 不会进行“顺序”排序。结果应该是相同的,但总体运行时间不同。那么 CPU 负载可能会有很大不同。
我肯定更喜欢选项 1 而不是 2:为什么先创建一个列表,然后再对其进行排序?!
想象一下,例如您稍后想要收集到一个不可变列表中。那么遵循第二个模式的所有代码都会被破坏。而使用模式 1 编写的代码根本不会受到影响!
当然,在这里的示例中这不应该导致问题,但是如果 sort() 发生在稍微不同的地方怎么办?!