考虑一个列表List<People>
,其中元素按People.getAge()
的升序排序。如果我们使用Collectors.groupingBy(People::getCity)
对此列表进行分组,那么每个组/城市的结果列表是否会按年龄排序?
在实践中,它似乎确实维护了秩序。我在找担保。
这个方法的Javadoc说:
如果不需要保留元素出现在结果地图收集器中的顺序,则使用groupingByConcurrent(函数)可以提供更好的并行性能
我不确定这是否指的是清单上物品的顺序。
发布于 2016-05-18 04:05:19
理解该合同的关键是在哪里写“元素出现的顺序”。它讨论了它们是否按顺序到达,这意味着它们是否按照顺序传递给密钥提取器Function
和任何下游收集器;它没有说明顺序是否会在任何结果积累中保留;实际上,groupingBy
的当前实现使用的是不保留密钥顺序的HashMap
。
您会问它是否指列表中项目的顺序。如果您指的是创建流的列表,则列表上创建的流确实按顺序开始,但有些流操作更改顺序或使其无序,因此,如果流保持有序,则引用的顺序引用管道操作完成后的结果顺序。如果流操作使流无序,则元素在收集器上出现的顺序不再是一个问题。
如果您引用列表中项的顺序,则分组项被收集到的顺序是,是的,因为“元素出现的顺序”是处理元素的顺序。当分组到下游收集器时,同样的情况也是如此;如果流仍然是有序的,并且您分组到一个保持顺序的下游收集器,这将保持该顺序,而并发版本可能不会。
https://stackoverflow.com/questions/37251477
复制相似问题