【发布时间】:2020-04-07 04:49:19
【问题描述】:
我有自定义比较器ChainedComparator,它有多个比较器,将在运行时传递。
class ChainedComparator implements Comparator<Person> {
private List<Comparator<Person>> comparatorList;
public int compare(Person o1, Person o2) {
for (Comparator<Person> comparator : comparatorList) {
int result = comparator.compare(o1, o2);
if (result != 0) {
return result;
}
}
return 0;
}
@SafeVarargs
public ChainedComparator(Comparator<Person>... comparators) {
this.comparatorList = Arrays.asList(comparators);
}
}
现在我想在运行时从字段名称 age 创建比较器,而不是像下面这样的硬编码
Comparator<Person> ageComparator = Comparator.comparing(Person::getAge);
Comparator<Person> lastNameComparator = Comparator.comparing(Person::getLastName);
Comparator<Person> ageComparator = Comparator.comparing(Person::getAge);
personList.stream().sorted(new ChainedComparator(firstNameComparator,ageComparator))
请给点建议
class Person {
Person(){}
String firstName;
String lastName;
int age;
String country;
public Person( String firstName, String lastName, int age,String country) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.country = country;
}
// getters and setters
}
【问题讨论】:
-
有点不清楚。您是说在运行之前您不会知道要比较的字段吗?
-
是的,我会在运行时获得年龄、名字等排序字段列表,我想在运行时创建比较器并将它们链接起来
-
我可以使用 switch 或 if 子句来检查字段名称并添加相应的比较器。但我想是通用的,我传递文件名,然后它获取方法引用并创建比较器
标签: java sorting reflection collections java-stream