假设我有一个这样的域模型:
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> ;,则以下代码将无效.在Java 8中比较(...)之前.
flightAssignmentList.sort(Comparator
.<FlightAssignment, LocalDateTime>comparing(a -> a.getFlight().getDepartureUTCDateTime())
.thenComparing(a -> a.getFlight().getArrivalUTCDateTime())
.thenComparing(FlightAssignment::getId));
较新的java版本具有更好的自动类型检测,可能不需要.