我有以下课程:
public class Foo {
private String areaName;
private String objectName;
private String lineName;
}
现在,我想将List<Foo>
转换为Map<String, Map<String, List<String>>>
。我发现this answer帮助我开发了以下代码:
Map<String, Map<String, List<String>>> testMap = foos.stream().collect(Collectors.groupingBy(e -> e.getAreaName(),
Collectors.groupingBy(e -> e.getObjectName(), Collectors.collectingAndThen(Collectors.toList(),
e -> e.stream().map(f -> f.getLineName())))));
此代码的唯一问题是应将其转换为List<String>
的部分。在那部分,我找不到将Foo
转换为List
的方法。
导致Map<String, Map<String, List<Foo>>>
的另一种方法:
Map<Object, Map<Object, List<Foo>>> testMap = ventures.stream().collect(Collectors.groupingBy(e -> e.getAreaName(),
Collectors.groupingBy(e -> e.getObjectName(), Collectors.toList())));
要从Map<String, Map<String, List<String>>>
接收List<Foo>
来接收{{1}},我需要更改什么?
答案 0 :(得分:11)
为了获得与List
元素类型不同的Stream
类型,应将Collectors.mapping
收集器链接到groupingBy
:
Map<String, Map<String, List<String>>> testMap =
foos.stream()
.collect(Collectors.groupingBy(Foo::getAreaName,
Collectors.groupingBy(Foo::getObjectName,
Collectors.mapping(Foo::getLineName,
Collectors.toList()))));