Java 8 List<Foo> 转换为 Map<String, Map<String, List<String>>>

8

我有以下的类:

public class Foo {
    private String areaName;
    private String objectName;
    private String lineName;
}

现在我想将一个 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())))));

这段代码唯一的问题在于它应该将其转换为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())));

我需要更改什么才能从 List<Foo> 接收到Map<String, Map<String, List<String>>>

1个回答

13

为了得到一个类型不同于Stream元素类型的List,您应该将 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()))));

非常感谢。我简直不敢相信我没看到Collectors::mapping方法! - XtremeBaumer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接