Java groupingBy收集器是否保留列表顺序



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

在实践中,它似乎确实维护了秩序。我在找担保。

该方法的Javadoc说:

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

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

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

您会问它是否指的是列表中项目的顺序。如果您引用的是创建流的List,那么在List上创建的流一开始确实是有序的,但有些流操作会更改顺序或使其无序,因此它引用的顺序是指在流保持有序的情况下完成管道操作后的结果顺序。如果流操作使流无序,则元素在收集器中出现的顺序不再是问题。

如果您指的是"列表"中项目的顺序,则分组项目的收集顺序是,因为"元素出现的顺序"是处理元素的顺序。分组到下游收集器时也是如此;如果Stream仍然是有序的,并且您分组到一个保留顺序的下游收集器,这将保留该顺序,而Concurrent版本可能不会。

最新更新