class Student {
List<Integer> grades
}我希望按成绩对学生进行分组,但如果每个学生只有一个成绩,groupingBy就可以工作。有没有别的lamba方法可以做到这一点?我期望像Map<Integer, List<Student>>那样的结果
发布于 2018-07-14 03:12:53
如果您提供帮助,groupingBy将完成这项工作:您可能会在groupingBy的Javadoc中找到与此等效的版本。
final List<Student> students = ...;
// @formatter:off
students.stream()
.flatMap(student -> student.grades.stream()
.map(grade -> new StudentGrade(student, grade)))
.collect(groupingBy(StudentGrade::getGrade, mapping(StudentGrade::getStudent, toList())));
// @formatter:on现在,你得到了一个Map<Integer, List<Student>>。由您决定是否过滤重复项。
您将需要这些导入:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;StudentGrade类很简单:
class StudentGrade {
private final Student student;
private final Integer grade;
public StudentGrade(Student student, Integer grade) {
this.student = student;
this.grade = grade;
}
public Student getStudent() {return student;}
public Integer getGrade() {return grade;}
}发布于 2018-07-14 03:26:21
Map<Integer, List<Student>> collect = students.stream()
.flatMap(student -> student.grades.stream()
.map(grade -> new AbstractMap.SimpleEntry<>(grade,
student)))
.collect(Collectors.groupingBy(entry -> entry.getKey(),
Collectors.mapping(Entry::getValue, Collectors.toList())));因为Java没有对元组实现,所以我使用了AbstractMap.SimpleEntry
https://stackoverflow.com/questions/51331186
复制相似问题