考虑列表List<People>
,其中元素按People.getAge()
的升序排序。如果我们使用Collectors.groupingBy(People::getCity)
对此列表进行分组,那么每个组/城市的结果列表是否会按年龄排序?
在实践中,它确实似乎保留了秩序。我正在寻找保证。
该方法的Javadoc说:
如果不需要保留元素出现在生成的Map收集器中的顺序,则使用groupingByConcurrent(Function)可以提供更好的并行性能
我不确定这是否是指列表中的项目顺序。
答案 0 :(得分:4)
理解合同的关键在于它所说的元素出现的顺序&#34;。它讨论了它们是否按顺序到达,这意味着它们是否按顺序传递给关键提取器Function
和任何下游收集器;它没有说明订单是否会保留在任何由此产生的积累中;实际上,groupingBy
的当前实现使用HashMap
,但不保留密钥顺序。
您询问它是否涉及列表中的项目顺序。如果您指的是创建Stream的List,则在List上创建的Stream会开始排序,但是某些流操作会更改顺序或使其无序,因此它引用的顺序是指管道之后生成的顺序如果流保持有序,则完成操作。如果流操作使流无序,则元素在收集器中出现的顺序不再是问题。
如果您指的是列表中项目的顺序,则收集分组的项目,是的,确实如此,因为元素出现的顺序是#34;是元素处理的顺序。分组到下游收集器时也是如此;如果仍然对Stream进行排序,并将您分组到保留顺序的下游收集器,则这将保留该顺序,而Concurrent版本可能不会。