嵌套字段的 Comparator.comparing(...)

2024-05-16

假设我有一个这样的域模型:

class Lecture {
     Course course;
     ... // getters
}

class Course {
     Teacher teacher;
     int studentSize;
     ... // getters
}

class Teacher {
     int age;
     ... // getters
}

现在我可以创建一个教师比较器,如下所示:

    return Comparator
            .comparing(Teacher::getAge);

但是我如何比较像这样的嵌套字段上的讲座呢?

    return Comparator
            .comparing(Lecture::getCourse::getTeacher:getAge) 
            .thenComparing(Lecture::getCourse::getStudentSize);

我无法添加方法Lecture.getTeacherAge()在模型上。


您不能嵌套方法引用。您可以改用 lambda 表达式:

return Comparator
        .comparing(l->l.getCourse().getTeacher().getAge(), Comparator.reverseOrder()) 
        .thenComparing(l->l.getCourse().getStudentSize());

不需要相反的顺序,它就更简洁了:

return Comparator
        .comparing(l->l.getCourse().getTeacher().getAge()) 
        .thenComparing(l->l.getCourse().getStudentSize());

注意:在某些情况下,您需要显式声明泛型类型。例如,如果没有以下代码,下面的代码将无法工作<FlightAssignment, LocalDateTime> before comparing(...)在Java 8中。

flightAssignmentList.sort(Comparator
        .<FlightAssignment, LocalDateTime>comparing(a -> a.getFlight().getDepartureUTCDateTime())
        .thenComparing(a -> a.getFlight().getArrivalUTCDateTime())
        .thenComparing(FlightAssignment::getId));

较新的 java 版本具有更好的自动类型检测功能,可能不需要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套字段的 Comparator.comparing(...) 的相关文章

随机推荐