Java Collectors.groupingBy()---是List命令?

Joe*_*oel 17 java java-8 java-stream collectors

对于Collectors.groupingBy()那个返回Map<K,List<T>>,它暗示List<T>是为了评估流?

我没有看到列表排序的明确描述,而并发版本明确表示没有排序.如果它没有以某种方式订购,我会期望它是一个收藏品,我不会看到除了收到订单之外的其他订单.

我希望保证每个列表中的最后一个值是该组收到的最后一个值.

shm*_*sel 20

文档groupingBy()说:

实施要求:

这会产生类似于的结果:

groupingBy(classifier, toList());
Run Code Online (Sandbox Code Playgroud)

文档toList()说:

返回:

a 按顺序Collector将所有输入元素收集到a List

因此,要回答您的问题,只要您的流具有已定义的遭遇订单,您就可以获得有序列表.


编辑:正如@Holger所指出的,groupingBy()还必须尊重遭遇顺序以保留toList()订购约束.这一事实在本说明中强烈暗示:

实施说明:

...如果不需要保留向下游收集器呈现元素的顺序,则使用groupingByConcurrent(Function, Collector)可以提供更好的并行性能.


naz*_*oya 5

我做了一个真实的测试,我用这个命令初始化了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)