gpt4 book ai didi

lambda - 按 Java 8 分组

转载 作者:行者123 更新时间:2023-12-02 11:33:51 25 4
gpt4 key购买 nike

假设您是一名注册类(class)的学生

Class Student{
ArrayList<Course> courses;
}
Class Course{
String id;
String name;
}

如何在 java 8 中使用 groupBy 函数来列出参加特定类(class)的学生

最佳答案

由于您想要将同一学生分为不同的组,因此 groupingBy 收集器在这里不适合(它将每个流元素精确地放入一个组)。

创建一个可变容器(如 HashMap)并通过 forEach 填充它会更有效:

Map<Course, List<Student>> result = new HashMap<>();
students.forEach(student -> student.courses.forEach(
course -> result.computeIfAbsent(course, c -> new ArrayList<>()).add(student)));

如果您想使用groupingBy,您可以不对学生进行分组,而是对学生-类(class)对进行分组,尽管您需要执行下游收集步骤:

import static java.util.stream.Collectors.*;

Map<Course, List<Student>> result = students.stream()
.<Map.Entry<Course, Student>>flatMap(
student -> student.courses.stream()
.map(course -> new AbstractMap.SimpleEntry<>(course, student)))
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

看起来有点丑。我的StreamEx库为这种情况添加了一些快捷方式:

Map<Course, List<Student>> result = StreamEx.of(students)
.cross(s -> s.courses.stream()).invert().grouping();

这看起来好多了,但简单的解决方案仍然看起来更好(并且不需要第三方库)。

关于lambda - 按 Java 8 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34972299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com