Java 分组按收集器是否保留列表顺序?

2022-09-02 13:57:47

考虑一个列表,其中元素按 的升序排序。如果我们使用 对这个列表进行分组,每个组/城市的结果列表是否仍然按年龄排序?List<People>People.getAge()Collectors.groupingBy(People::getCity)

在实践中,它似乎确实保留了秩序。我正在寻找保证。

该方法的Javadoc说:

如果不需要保留元素在生成的 Map 收集器中的显示顺序,则使用 groupingByConcurrent(Function) 可以提供更好的并行性能

我不确定这是否是指清单上项目的顺序。


答案 1

理解合同的关键是它在哪里说“元素出现的顺序”。它讨论了它们是否按顺序到达,这意味着它们是否按顺序传递到密钥提取器和任何下游收集器;它没有说明订单是否会在任何由此产生的累积中得到保留;实际上,当前实现使用的 a 并不保留键顺序。FunctiongroupingByHashMap

您询问它是否是指列表中项目的顺序。如果您指的是从中创建流的列表,则在 List 上创建的流开始时确实是有序的,但某些流操作会更改顺序或使其无序,因此,如果流保持有序,则它所指的排序是指管道操作完成后的结果顺序。如果流操作使流无序,则元素在收集器中的显示顺序不再是问题。

如果您指的是列表中项目的顺序,则分组项目被收集到,是的,它确实如此,因为“元素出现的顺序”是处理元素的顺序。分组到下游收集器时也是如此。如果流仍已排序,并且您分组到保留顺序的下游收集器,这将保留该顺序,而并发版本可能不会。


答案 2

推荐