【发布时间】:2019-02-26 04:10:21
【问题描述】:
一般来说,这两段代码之间是否存在性能差异?
List<Integer> list1 = someStream1.sorted().collect(toList());
// vs.
List<Integer> list2 = someStream2.collect(toList());
list2.sort(Comparator.naturalOrder())
变体 2 显然很糟糕,应该避免,但我很好奇 Stream 的主流(呵呵,mainstream)实现中是否内置了任何性能优化,这会导致性能这两者的区别。
我想,因为流有更多关于情况的信息,所以它会有更好的优化机会。例如。我想如果这有一个findFirst() 调用,它会省略排序,有利于min 操作。
【问题讨论】:
-
@FedericoPeraltaSchaffner 啊,是的,关注这个问题很好。我把它改成了
Integer,这样Comparable的实现就知道了。我还更改了流名称,以明确我没有重复相同的流两次(这是无效的) -
@FedericoPeraltaSchaffner 或者只是
list.sort(null)。 -
@shmosel 很有趣,谢谢......从来没有注意到这也是有效的......认为会抛出
NullPointerException:) -
恕我直言,斯蒂芬的回答对于理解What is more efficient: sorted stream or sorting a list? 的区别确实更有意义。此外,由于链接问题中也有基准,我会投票将其标记为重复。 (我敢肯定没有多少人会第二:D)
标签: java list sorting java-stream collectors