2016-07-22 36 views
5

Załóżmy, że mam modelu domeny tak:Comparator.comparing (...) z zagnieżdżonego pola

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

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

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

Teraz mogę utworzyć Teacher Komparator tak:

return Comparator 
      .comparing(Teacher::getAge); 

Ale jak czy porównuję wykład na zagnieżdżonych polach, tak jak to?

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

Nie mogę dodać metody Lecture.getTeacherAge() w modelu.

+2

dlaczego nie używać lambda? – njzk2

+0

Ach ... w tej chwili, gdy zdałem sobie sprawę, że zadałem głupie pytanie :) (Nie, że są jakieś głupie pytania.) –

Odpowiedz

12

Nie można zagnieżdżać odniesień metod. Zamiast tego można użyć wyrażeń lambda:

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

Niestety nie ma tu ładnej składni w języku Java.

Jeśli chcesz ponownie użyć części komparatora widzę 2 sposoby:

  • przez składających komparatorów

    return comparing(Lecture::getCourse, comparing(Course::getTeacher, comparing(Teacher::getAge))) 
         .thenComparing(Lecture::getCourse, comparing(Course::getStudentSize)); 
    
    // or with separate comparators 
    Comparator<Teacher> byAge = comparing(Teacher::getAge); 
    Comparator<Course> byTeacherAge = comparing(Course::getTeacher, byAge); 
    Comparator<Course> byStudentsSize = comparing(Course::getStudentSize); 
    return comparing(Lecture::getCourse, byTeacherAge).thenComparing(Lecture::getCourse, byStudentsSize); 
    
  • przez komponowanie FUNKCJE Getter

    Function<Lecture, Course> getCourse = Lecture::getCourse;    
    return comparing(getCourse.andThen(Course::getTeacher).andThen(Teacher::getAge)) 
         .thenComparing(getCourse.andThen(Course::getStudentSize)); 
    
    // or with separate getters 
    Function<Lecture, Course> getCourse = Lecture::getCourse; 
    Function<Lecture, Integer> teacherAge = getCourse.andThen(Course::getTeacher).andThen(Teacher::getAge); 
    Function<Lecture, Integer> studentSize = getCourse.andThen(Course::getStudentSize); 
    return comparing(teacherAge).thenComparing(studentSize);