【问题标题】:Reverse of grouping in java 8java 8中分组的反转
【发布时间】:2017-08-17 13:22:43
【问题描述】:

我可以使用下面的 lamda 表达式对学生列表进行分组。结果将按“部门”分组学生列表,然后按“性别”分组。

Map<String, Map<String, List<Student>>> studentCatg = studentList.stream().collect(groupingBy(Student::getDepartment, groupingBy(Student::getGender)));

现在我需要从上面的 MAP 中获取一个包含特定部门学生的单一列表。有什么与分组相反的吗?

【问题讨论】:

    标签: collections java-8 grouping java-stream collect


    【解决方案1】:

    您可以获得给定部门的EntrySet,将Map&lt;String, List&lt;Student&gt;&gt;List&lt;List&lt;Student&gt;&gt; 通过map 组合到条目设置值,然后将flatMapList&lt;Student&gt; 组合起来,如下所示:

    String department = "department name";
    List<Student> students = studentCatg.get(department)
        .values()
        .stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toList())
    

    恢复到初始列表

    List<Student> students = studentCatg.values()
            .stream()
            .map(Map::values)
            .flatMap(Collection::stream)
            .flatMap(Collection::stream)
            .collect(Collectors.toList());
    

    【讨论】:

    • 刚刚调整了您的帖子并得到了答案。谢谢顺便说一句。 String department = "部门名称"; List 学生 = studentCatg.get(department).values.stream().flatMap(Collection::stream).collect(Collectors.toList())
    • @june 是的,可以通过使用values 而不是entrySet 来简化它,很好! :)
    • 是否有代码可以完全反转?通过分组列出到 Map>。现在 Map> 到 List ?
    • @june 你的意思是与最初的studentList 列表相反吗?
    • @june 我也更新了答案来解释这个案例。
    【解决方案2】:

    我在寻找一种反转 groupingBy 映射的方法时发现了这个条目,但由于我没有找到通用的解决方案,所以我构建了自己的解决方案,以防万一。

    public static <K, V> Map<V, List<K>> invertGroupByMap(final Map<K, List<V>> src)
    {
        return src.entrySet().stream()
                .flatMap(e -> e.getValue().stream().map(a -> new SimpleImmutableEntry<>(a, e.getKey())))
                .collect(Collectors.groupingBy(Map.Entry::getKey,
                        Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 2021-02-04
      • 1970-01-01
      • 2017-04-04
      • 2016-06-10
      • 1970-01-01
      相关资源
      最近更新 更多