【发布时间】:2016-09-12 02:22:21
【问题描述】:
考虑一个列表List<People>,其中元素按People.getAge() 的升序排序。如果我们使用Collectors.groupingBy(People::getCity) 对该列表进行分组,每个组/城市的结果列表是否仍按年龄排序?
实际上,它似乎确实保留了顺序。我正在寻找保证。
该方法的 Javadoc 说:
如果不需要保留元素在生成的 Map 收集器中出现的顺序,则使用 groupingByConcurrent(Function) 可能会提供更好的并行性能
我不确定这是否指的是列表中项目的顺序。
【问题讨论】:
-
您的 Javadoc 引用非常清楚地说明了这一点。为什么会有疑问?
-
@FrankPuffer:地图收集器是指用于构建地图元素的toList收集器吗?
-
@FrankPuffer:
groupingBy保留了订单,但遗憾的是,Collectors.groupingBy's JavaDoc 并没有说明这样做的任何内容。这很糟糕,因为虽然我们可以查看 OpenJDK 实现或进行实证测试,但它们告诉我们的只是实现当前做了什么,而不是合约是什么。所以希望它在 JDK API 文档中某处得到澄清。 -
@FrankPuffer 引用的部分确实没有。只讲了不需要保存的情况,没有讲需要保存的情况;)
-
@T.J.Crowder, @Mifeet:从严格的逻辑角度来看,你是对的。但是如果
groupingBy不能保证保持秩序,那么引用的句子就没有意义了。 (我不希望标准包的 JavaDoc 中有无意义的陈述。)
标签: java java-stream collectors