首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Comparator.comparing(...)嵌套字段的

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

Stack Overflow用户
提问于 2016-07-23 02:42:11
回答 3查看 30.2K关注 0票数 34

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

代码语言:javascript
复制
class Lecture {
     Course course;
     ... // getters
}

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

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

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

代码语言:javascript
复制
    return Comparator
            .comparing(Teacher::getAge);

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

代码语言:javascript
复制
    return Comparator
            .comparing(Lecture::getCourse::getTeacher:getAge) 
            .thenComparing(Lecture::getCourse::getStudentSize);

我不能在模型上添加方法Lecture.getTeacherAge()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-23 02:45:11

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

代码语言:javascript
复制
return Comparator
        .comparing(l->l.getCourse().getTeacher().getAge(), Comparator.reverseOrder()) 
        .thenComparing(l->l.getCourse().getStudentSize());

不需要逆序,它甚至更不冗长:

代码语言:javascript
复制
return Comparator
        .comparing(l->l.getCourse().getTeacher().getAge()) 
        .thenComparing(l->l.getCourse().getStudentSize());

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

代码语言:javascript
复制
flightAssignmentList.sort(Comparator
        .<FlightAssignment, LocalDateTime>comparing(a -> a.getFlight().getDepartureUTCDateTime())
        .thenComparing(a -> a.getFlight().getArrivalUTCDateTime())
        .thenComparing(FlightAssignment::getId));

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

票数 53
EN

Stack Overflow用户

发布于 2016-07-25 05:58:26

不幸的是,java中没有很好的语法来实现这一点。

如果你想重用比较器的一部分,我有两种方法:

通过组合比较器实现

返回比较(课程::getCourse,比较(课程::getTeacher,比较(Teacher::getAge)).thenComparing(课程::getCourse,比较(课程::getStudentSize));//或使用单独的比较器比较器byAge =比较(教师::getAge);比较器byTeacherAge =比较(课程::getTeacher,byAge);比较器byStudentsSize =比较(课程::getStudentSize);返回比较(Lecture::getCourse,byTeacherAge).thenComparing(Lecture::getCourse,byStudentsSize);

  • by composing getter函数

.thenComparing(getCourse.andThen(Course::getStudentSize));,Course> getCourse = Lecture:: getCourse;Function getCourse= Lecture::getCourse;Function teacherAge =Lecture Function studentSize =getCourse.andThen(课程::getStudentSize);返回getCourse

票数 14
EN

Stack Overflow用户

发布于 2018-08-10 04:13:15

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;

  class Person {
      String name ;
      PersonalDetail pDetail;
    public Person(String name, PersonalDetail pDetail) {
        super();
        this.name = name;
        this.pDetail = pDetail;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public PersonalDetail getpDetail() {
        return pDetail;
    }
    public void setpDetail(PersonalDetail pDetail) {
        this.pDetail = pDetail;
    }




  }

  class PersonalDetail{
      BirthDate birthDate;

    public BirthDate getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(BirthDate birthDate) {
        this.birthDate = birthDate;
    }

    public PersonalDetail(BirthDate birthDate) {
        super();
        this.birthDate = birthDate;
    }


  }

    class BirthDate {
        public String getBirthdate() {
            return birthdate;
        }

        public void setBirthdate(String birthdate) {
            this.birthdate = birthdate;
        }

    String birthdate;

        public BirthDate(String birthdate) {
            super();

            this.birthdate = birthdate;
        }  
  }

  public class Test1 {
       public static void main(String[] args) {
           BirthDate b1 = new BirthDate("2019-08-08");
           BirthDate b2 = new BirthDate("2025-09-09");
           BirthDate b3 = new BirthDate("2025-09-08");
           BirthDate b4 = new BirthDate("2024-09-08");

           PersonalDetail pd1  = new PersonalDetail(b1);
           PersonalDetail pd2  = new PersonalDetail(b2);
           PersonalDetail pd3  = new PersonalDetail(b3);
           PersonalDetail pd4  = new PersonalDetail(b4);

           Person p1  = new Person("P1",pd1);
           Person p2  = new Person("P2",pd2);
           Person p3  = new Person("P3",pd3);
           Person p4  = new Person("P4",pd4);

           List<Person> persons = new ArrayList();
           persons.add(p1);
           persons.add(p2);
           persons.add(p3);
           persons.add(p4);

           Function<Person, PersonalDetail> getCourse = Person::getpDetail;  

           Person minByAge = persons.stream()
                      .max(Comparator.comparing(getCourse.andThen(PersonalDetail::getBirthDate).andThen(BirthDate::getBirthdate))).get();


          System.out.println(maxByAge.getName());

       }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38533338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档