假设我有一个这样的域模型:
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()。
发布于 2016-07-23 02:45:11
你不能嵌套方法引用。您可以改用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());注意:在某些情况下,您需要显式地声明泛型类型。例如,在Java8中,如果没有comparing(...)之前的<FlightAssignment, LocalDateTime>,下面的代码将无法工作。
flightAssignmentList.sort(Comparator
.<FlightAssignment, LocalDateTime>comparing(a -> a.getFlight().getDepartureUTCDateTime())
.thenComparing(a -> a.getFlight().getArrivalUTCDateTime())
.thenComparing(FlightAssignment::getId));较新的java版本有更好的自动类型检测,可能不需要这样做。
发布于 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);
.thenComparing(getCourse.andThen(Course::getStudentSize));,Course> getCourse = Lecture:: getCourse;Function getCourse= Lecture::getCourse;Function teacherAge =Lecture Function studentSize =getCourse.andThen(课程::getStudentSize);返回getCourse
发布于 2018-08-10 04:13:15
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());
}
}https://stackoverflow.com/questions/38533338
复制相似问题