使用stream().sorted()相比于Collection.sort()有什么优势吗?

10

在Java中出现流之前,我曾经使用以下代码对元素进行排序:

Collections.sort(collection, new CustomComparator());

现在我发现只需这样做就可以得到相同的结果:
collection.stream().sorted(new CustomComparator());

在两种情况下,我使用了列表和自定义比较器来实现Comparator(我需要这个,无法在类本身上实现)。
除了流解决方案“看起来更好”之外,我没有发现任何表明它们有任何不同的东西。
使用流版本有什么优势吗?我的意思是... 它更高效吗?有什么区别吗?

5
Collections.sort(...) 会在原来的集合中就地排序,而 collection.stream().sorted() 则返回一个排序后的流,你需要将其收集到一个新变量(集合)中。 - Oleksandr Pyrohov
谢谢@Oleksandr。非常好的答案。我差点犯了一个错误。 - Sebastian D'Agostino
1
collection.sort(new CustomComparator()) 怎么样? - shmosel
性能:https://dev59.com/51UL5IYBdhLWcg3wyKkk - TrueCall
1个回答

12

collection.stream().sorted(new CustomComparator()) 不会排序 collection,只是使流变成有序的。

要使用 Stream API 实现类似的效果,你应该使用一个终端操作 - 将其收集到一个新列表中:

collection.stream().sorted(new CustomComparator()).collect(Collectors.toList());

它不会修改原始集合(流源),但是Collections.sort会。


如果原始顺序很重要,我会复制集合并对其进行排序。

List<?> collectionCopy = new ArrayList(collection);
Collections.sort(collectionCopy, new CustomComparator());

那么这个优势只有在你想要创建一个副本的时候才存在吗? - superigno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接