代码之家  ›  专栏  ›  技术社区  ›  XtremeBaumer

java8 List<Foo>到Map<String,Map<String,List<String>>

  •  5
  • XtremeBaumer  · 技术社区  · 7 年前

    我有以下课程:

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

    我需要改变什么才能收到 列表<Foo> ?

    1 回复  |  直到 7 年前
        1
  •  13
  •   Eran    7 年前

    为了得到一个 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()))));