Collections Java8中分组的反向
我可以使用下面的lamda表达式对学生列表进行分组。结果是将学生名单按“系”分组,然后按“性别”分组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)); 现在我需要从上面的地图中得到一个列表,其中应该包含特定系的学生。有什么与分组相反的吗?你可以获得给定部门的入口集,将映射到列表通过映射到输入集值,然后平面映射到列表,类似这
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())));
}