Java 8 List <Foo> to Map <String,Map <String,List <String >>>

Xtr*_*mer 5 java java-8 java-stream

我有以下课程:

public class Foo {
    private String areaName;
    private String objectName;
    private String lineName;
}
Run Code Online (Sandbox Code Playgroud)

现在我想转换List<Foo>Map<String, Map<String, List<String>>>.我发现这个答案帮助我开发了以下代码:

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())))));
Run Code Online (Sandbox Code Playgroud)

此代码的唯一问题是它应转换为的部分List<String>.我无法找到转换FooList该部分的方法.

另一种方法导致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())));
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能得到改变Map<String, Map<String, List<String>>>List<Foo>

Era*_*ran 11

为了获得ListStream元素类型不同的类型,您应该将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()))));
Run Code Online (Sandbox Code Playgroud)