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

标签 java java-stream collectors

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

实际上,它似乎确实保留了顺序。我正在寻找保证。

该方法的 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

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

最佳答案

理解契约的关键在于它所说的“元素出现的顺序”。它讨论它们是否按顺序到达,这意味着它们是否按顺序传递给 key 提取器 Function 和任何下游收集器;它没有说明订单是否会保留在任何结果累积中;事实上,groupingBy 的当前实现使用了一个不保留键顺序的 HashMap

你问它是否指的是列表中项目的顺序。如果您指的是从中创建 Stream 的 List,则在 List 上创建的 Stream 确实开始时是有序的,但是某些流操作会更改顺序或使其无序,因此它所指的顺序是指流水线之后的结果顺序如果流保持有序,则操作完成。如果流操作使流无序,则元素在收集器中出现的顺序不再是问题。

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

关于java - Java groupingBy 收集器是否保留列表顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37251477/

相关文章:

java - 使用passwordField连接到mySQL

java - 串行 Steam 的性能、内部工作和执行顺序

java - 使用 Java Streams 从列表中解析列表

java - Lambda 的行为与匿名内部类不同

java - 在实例上调用 new,例如 pc.new InnerClass() ——发生了什么?

java - JLayeredPane 不更新 JLabel 的移动

java - 将 List<Object[]> 数组转换为 Map

java - 使用参数化流跟踪迭代

Java lang IllegalAccess 通过 HashBasedTable 累加器收集 Guava 不可变表

java - 在 Collectors.toMap 中获取 key