2 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
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())));
因?yàn)槲覜]有使用Java的Pair tuple實(shí)現(xiàn) AbstractMap.SimpleEntry

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
groupingBy如果您有所幫助,它將完成此工作:您可能會(huì)在Javadoc中為groupingBy找到與此版本等效的版本。
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
現(xiàn)在,您得到一個(gè)Map<Integer, List<Student>>。過濾重復(fù)項(xiàng)取決于您。
您將需要這些導(dǎo)入:
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;}
}
添加回答
舉報(bào)