一般来说,这两段代码之间是否存在性能差异?
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操作.
由Maurice Naftalin掌握Lambdas,第6章 - 流表演.
有关不同执行阶段(中间和终端)流的不同特征的解释.例如.
Stream.of(8,3,5,6,7,4)//ORDERED, SIZED
.filer(i->i%2==0) // ORDERED
.sorted() // ORDERED, SORTED
.distinct() // DISTINCT, ORDERED, SORTED
.map(i->i+1) // ORDERED
.unordered(); //none
Run Code Online (Sandbox Code Playgroud)
令我困惑的是对SORTED特征的解释:
"如果比较器已被定义并用于此目的,则流元素可能已按其他顺序排序,但此类流不具有SORTED特征."
为什么如果提供自定义比较器来实现排序数据结构(在上面的情况下为SortedMap),框架不会考虑创建具有SORTED特性的流?
我曾经使用以下行来在Java中出现流之前对元素进行排序:
Collections.sort(collection, new CustomComparator());
Run Code Online (Sandbox Code Playgroud)
现在我发现我可以通过以下方式获得相同的结果:
collection.stream().sorted(new CustomComparator());
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都使用一个列表和一个实现的自定义比较器Comparator(我需要这个并且不能在类本身上实现它).
我没有找到任何表明它们在任何方面都不同的东西,除了流解决方案看起来更好的事实.
使用流版本有什么好处吗?我的意思是......性能更高吗?有什么区别吗?
java ×4
java-stream ×3
sorting ×2
benchmarking ×1
collections ×1
collectors ×1
java-8 ×1
jvm ×1
jvm-hotspot ×1
list ×1