Java groupingBy 收集器是否保留列表顺序?
Does Java groupingBy collector preserve list order?
考虑一个列表 List<People>
,其中元素按 People.getAge()
的升序排序。如果我们使用 Collectors.groupingBy(People::getCity)
对这个列表进行分组,每个 groups/cities 的结果列表是否会保持按年龄排序?
实际上,它似乎确实保留了顺序。我正在寻找保证。
该方法的 Javadoc 说:
If preservation of the order in which elements appear in the resulting Map collector is not required, using groupingByConcurrent(Function) may offer better parallel performance
我不确定这是否指的是列表中项目的顺序。
理解合同的关键在于它所说的 "the order in which elements appear"。它谈论它们是否按顺序到达,这意味着它们是否按顺序传递给密钥提取器 Function
和任何下游收集器;它没有说明订单是否会保留在任何结果累积中;事实上,groupingBy
的当前实现使用 HashMap
,它不保留键顺序。
你问它是否指的是列表中项目的顺序。如果您指的是从中创建 Stream 的 List,则在 List 上创建的 Stream 确实开始时是有序的,但是某些流操作会更改顺序或使其无序,因此它所指的顺序是指流水线之后的结果顺序如果流保持有序,则操作完成。如果流操作使流无序,则元素在收集器中出现的顺序不再是问题。
如果您指的是列表中项目的顺序,则分组项目收集到的是,是的,因为 "order in which the elements appear" 是处理元素的顺序。分组到下游收集器时也是如此;如果 Stream 仍然是有序的,并且您分组到保留顺序的下游收集器,这将保留该顺序,而并发版本可能不会。
考虑一个列表 List<People>
,其中元素按 People.getAge()
的升序排序。如果我们使用 Collectors.groupingBy(People::getCity)
对这个列表进行分组,每个 groups/cities 的结果列表是否会保持按年龄排序?
实际上,它似乎确实保留了顺序。我正在寻找保证。
该方法的 Javadoc 说:
If preservation of the order in which elements appear in the resulting Map collector is not required, using groupingByConcurrent(Function) may offer better parallel performance
我不确定这是否指的是列表中项目的顺序。
理解合同的关键在于它所说的 "the order in which elements appear"。它谈论它们是否按顺序到达,这意味着它们是否按顺序传递给密钥提取器 Function
和任何下游收集器;它没有说明订单是否会保留在任何结果累积中;事实上,groupingBy
的当前实现使用 HashMap
,它不保留键顺序。
你问它是否指的是列表中项目的顺序。如果您指的是从中创建 Stream 的 List,则在 List 上创建的 Stream 确实开始时是有序的,但是某些流操作会更改顺序或使其无序,因此它所指的顺序是指流水线之后的结果顺序如果流保持有序,则操作完成。如果流操作使流无序,则元素在收集器中出现的顺序不再是问题。
如果您指的是列表中项目的顺序,则分组项目收集到的是,是的,因为 "order in which the elements appear" 是处理元素的顺序。分组到下游收集器时也是如此;如果 Stream 仍然是有序的,并且您分组到保留顺序的下游收集器,这将保留该顺序,而并发版本可能不会。