Collections Java8中分组的反向

Collections Java8中分组的反向,collections,java-8,grouping,java-stream,collect,Collections,Java 8,Grouping,Java Stream,Collect,我可以使用下面的lamda表达式对学生列表进行分组。结果是将学生名单按“系”分组,然后按“性别”分组 Map studentCatg=studentList.stream().collect(groupingBy(Student::getDepartment,groupingBy(Student::getGender)); 现在我需要从上面的地图中得到一个列表,其中应该包含特定系的学生。有什么与分组相反的吗?你可以获得给定部门的入口集,将映射到列表通过映射到输入集值,然后平面映射到列表,类似这

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

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

现在我需要从上面的地图中得到一个列表,其中应该包含特定系的学生。有什么与分组相反的吗?

你可以获得给定部门的
入口集
,将
映射
列表
通过
映射
到输入集值,然后
平面映射
列表
,类似这样:

String department = "department name";
List<Student> students = studentCatg.get(department)
    .values()
    .stream()
    .flatMap(Collection::stream)
    .collect(Collectors.toList())
String department=“部门名称”;
列出学生=studentCatg.get(系)
.values()
.stream()
.flatMap(集合::流)
.collect(收集器.toList())
恢复到初始列表
List students=studentCatg.values()
.stream()
.map(映射::值)
.flatMap(集合::流)
.flatMap(集合::流)
.collect(Collectors.toList());

我在寻找反转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())));
}
公共静态映射invertGroupByMap(最终映射src)
{
返回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());
}

刚刚调整了你的帖子并得到了答案。谢谢。字符串department=“department name”;List students=studentCatg.get(department).values.stream().flatMap(Collection::stream).collect(Collectors.toList())@june是的,它可以通过采用
值来简化,而不是
entrySet
,很好的捕获!)是否有代码进行完全反转?要按分组映射的列表。现在映射到列表?@june你的意思是与初始的
studentList
List相反吗?@june我也更新了答案来解释这个案例。
List<Student> students = studentCatg.values()
        .stream()
        .map(Map::values)
        .flatMap(Collection::stream)
        .flatMap(Collection::stream)
        .collect(Collectors.toList());
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())));
}