java 如何按属性分组并获得最大值的Map?

n9vozmp4  于 2022-12-10  发布在  Java
关注(0)|答案(2)|浏览(176)

我有以下几类:

public class StudentGrade {
   int studentId;
   double value;
   Date date;
   ...
}

我想以Map的形式获取学生的最高成绩(studentId -〉StudentGrade)

public Map<Integer, StudentGrade> getMaxGradeByStudent(List<StudentGrade> grades) {
    Map<Integer, Optional<StudentGrade>> maxGrades = grades.stream().collect(
        Collectors.groupingBy(
            StudentGrade::getStudentId,
            Collectors.maxBy(Comparator.comparing(StudentGrade::getValue)))
    );
    Map<Integer, StudentGrade> finalGrades = new HashMap<>();
    maxGrades.entrySet().forEach(entry -> {
        entry.getValue().ifPresent(value -> finalGrades.put(entry.getKey(), value));
    })
}

有没有更好的方法来做这件事?我想避免必须初始化一个新的散列表和使用流的一切。

irtuqstp

irtuqstp1#

您可以使用toMap代替groupingBy,使用BinaryOperator代替Collectors.maxBy,例如:

public Map<Integer, StudentGrade> getMaxGradeByStudent(List<StudentGrade> grades) {
    return grades.stream()
            .collect(Collectors.toMap(StudentGrade::getStudentId,
                   x -> x, // Or Function.identity(),
                   BinaryOperator.maxBy(Comparator.comparing(StudentGrade::getValue))));
}
a11xaf1n

a11xaf1n2#

如果要避免流,可以使用此选项

public Map<Integer, StudentGrade> getMaxGradeByStudent(List<StudentGrade> grades) {
    Map<Integer, StudentGrade> studentIdToMaxGrade = new HashMap<>();
    for (StudentGrade grade : grades) {
        studentIdToMaxGrade.merge(
                grade.getStudentId(),
                grade,
                BinaryOperator.maxBy(Comparator.comparing(StudentGrade::getValue))
        );
    }
    return studentIdToMaxGrade;
}

相关问题