【发布时间】:2019-12-03 19:49:42
【问题描述】:
sorted operation 的文档说:
对于有序流,排序是稳定的。对于无序流,不保证稳定性。
page-summary 说:
一些中间操作,例如 sorted(),可能会施加遇到顺序
有人能解释一下为什么sorted 操作需要对 Stream 的遭遇顺序(我没有看到遭遇顺序的存在与排序操作之间的关系)吗?
这是否意味着以下代码无效(因为 HashSet 本质上不是有序的)?
Set<Integer> mySet = new HashSet<>();
mySet.add(10);
mySet.add(4);
mySet.add(20);
mySet.add(15);
mySet.add(22);
mySet.add(-3);
List<Integer> result = mySet.stream().sorted().collect(Collectors.toList());
System.out.println(result);
当我运行这段代码时,它总是给我同样的输出[-3, 4, 10, 15, 20, 22]
事件如果我使用.parrallel(),输出保持不变[-3, 4, 10, 15, 20, 22]
mySet.stream().parallel().sorted().collect(Collectors.toList());`
【问题讨论】:
-
问题是,如果排序不稳定,相同的项目可能不在它们开始的相同位置。如果正在排序的项目中有其他属性,这一点很重要。在您的示例中,这是无关紧要的,因为只有一个值,一个整数。 This 也可能有帮助。
-
所以只有equals项是不可预测的?
-
这是我的理解。
-
应该已经写在文档里了,因为不是很清楚。这篇 stackoverflow.com/questions/41894173/… 的帖子展示了一个关于 disinct 如何受订单影响的具体示例
-
请注意
parallel()不需要并行操作。这只是一个建议。而对于那少量的项目,Java 很可能不会听从你的建议。
标签: java java-stream