Java 8 List <foo>到Map <string,map <string,=“” list <string =“” >>>

时间:2018-11-01 12:17:46

标签: java java-8 java-stream

我有以下课程:

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}},我需要更改什么?

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()))));