Java groupingBy collector是否保留列表顺序?

时间:2016-05-16 10:14:42

标签: java java-stream collectors

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

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

该方法的Javadoc说:

  

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

我不确定这是否是指列表中的项目顺序。

1 个答案:

答案 0 :(得分:4)

理解合同的关键在于它所说的元素出现的顺序&#34;。它讨论了它们是否按顺序到达,这意味着它们是否按顺序传递给关键提取器Function和任何下游收集器;它没有说明订单是否会保留在任何由此产生的积累中;实际上,groupingBy的当前实现使用HashMap,但不保留密钥顺序。

您询问它是否涉及列表中的项目顺序。如果您指的是创建Stream的List,则在List上创建的Stream会开始排序,但是某些流操作会更改顺序或使其无序,因此它引用的顺序是指管道之后生成的顺序如果流保持有序,则完成操作。如果流操作使流无序,则元素在收集器中出现的顺序不再是问题。

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