Joe*_*oel 17 java java-8 java-stream collectors
对于Collectors.groupingBy()那个返回Map<K,List<T>>,它暗示List<T>是为了评估流?
我没有看到列表排序的明确描述,而并发版本明确表示没有排序.如果它没有以某种方式订购,我会期望它是一个收藏品,我不会看到除了收到订单之外的其他订单.
我希望保证每个列表中的最后一个值是该组收到的最后一个值.
shm*_*sel 20
文档groupingBy()说:
实施要求:
这会产生类似于的结果:
Run Code Online (Sandbox Code Playgroud)groupingBy(classifier, toList());
文档toList()说:
返回:
a 按顺序
Collector将所有输入元素收集到aList中
因此,要回答您的问题,只要您的流具有已定义的遭遇订单,您就可以获得有序列表.
编辑:正如@Holger所指出的,groupingBy()还必须尊重遭遇顺序以保留toList()订购约束.这一事实在本说明中强烈暗示:
实施说明:
...如果不需要保留向下游收集器呈现元素的顺序,则使用
groupingByConcurrent(Function, Collector)可以提供更好的并行性能.
我做了一个真实的测试,我用这个命令初始化了ArrayList<TimeBased>:
{"1", "2019-03-22 10:20:03", "1"},
{"2", "2019-03-22 10:30:03", "2"},
{"2", "2019-03-22 11:20:03", "3"},
{"1", "2019-03-22 11:20:15", "4"},
{"3", "2019-03-22 11:35:03", "5"},
{"2", "2019-03-22 12:20:03", "6"}
Run Code Online (Sandbox Code Playgroud)
并按第一列和第二列分组,但结果是:
id birth number
1 Fri Mar 22 10:20:03 CST 2019 1
1 Fri Mar 22 11:20:15 CST 2019 4
2 Fri Mar 22 12:20:03 CST 2019 6
2 Fri Mar 22 11:20:03 CST 2019 3
2 Fri Mar 22 10:30:03 CST 2019 2
3 Fri Mar 22 11:35:03 CST 2019 5
Run Code Online (Sandbox Code Playgroud)
所以你看,顺序是意外的(日期列顺序混乱)。
在我这样做之后(添加 LinkedList::new):
Map<Integer, Map<Date, List<TimeBased>>> grouped =
timeBasedBeans.stream().collect(groupingBy(TimeBased::getId, groupingBy(TimeBased::getPeriod,
LinkedHashMap::new, toList())));
Run Code Online (Sandbox Code Playgroud)
那么顺序是正确的:
id birth number
1 Fri Mar 22 10:20:03 CST 2019 1
1 Fri Mar 22 11:20:15 CST 2019 4
2 Fri Mar 22 10:30:03 CST 2019 2
2 Fri Mar 22 11:20:03 CST 2019 3
2 Fri Mar 22 12:20:03 CST 2019 6
3 Fri Mar 22 11:35:03 CST 2019 5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4989 次 |
| 最近记录: |