为什么排序操作将遇到顺序强加给流?

Oli*_*ssé 7 java java-stream

排序操作的文档说:

对于有序流,排序是稳定的。对于无序流,没有稳定性保证。

页面总结说:

一些中间操作,例如 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);
Run Code Online (Sandbox Code Playgroud)

当我运行这段代码时,它总是给我相同的输出 [-3, 4, 10, 15, 20, 22]

事件如果我使用.parrallel(),输出保持不变[-3, 4, 10, 15, 20, 22]

mySet.stream().parallel().sorted().collect(Collectors.toList());`
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 8

当我运行这段代码时,它总是给我相同的输出

是的。它按预期对集合进行排序。看来你误解了“稳定”这个词。排序中的稳定性是指不移动相等的元素。

稳定排序算法按照它们在输入中出现的相同顺序对重复元素进行排序

在维基百科上阅读更多内容

您的列表没有重复元素,因此稳定性不适用,您无法通过观察输出来确定稳定性。

有人可以解释为什么排序操作需要对 Stream 的遇到顺序

它没有。引述说它可能“强加遭遇命令”。也就是说,在操作之后会有一个定义好的遭遇顺序sort,而不是要求之前有一个。