java – 嵌套字段的Comparator.comparing(…)

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

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

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

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

现在我可以像这样创建一个教师比较器:

    return Comparator
            .comparing(Teacher::getAge);

但是,我如何比较Lecture的嵌套字段,像这样?

    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&gt ;,则以下代码将无效.在Java 8中比较(...)之前.

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

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

上一篇:java – 为什么sort取一个Object数组?


下一篇:c – 标准库是否有比较器反转机制?