我有一个员工类,如下所示
public class Employee {
private String name;
private String jobTitle;
private int age;
private int salary;
public Employee(String name, String jobTitle, int age, int salary) {
this.name = name;
this.jobTitle = jobTitle;
this.age = age;
this.salary = salary;
}
然后我有一个 Util 类来对员工进行排序,例如
public class EmployeeComparator {
private EmployeeComparator(){}
public static List<Employee> sortEmployees(List<Employee> employeeList, String secondarySortField) {
Comparator<Employee> compareByName = Comparator
.comparing(Employee::getName).thenComparing(Employee::getAge);
List<Employee> sortedEmployees = employeeList.stream()
.sorted(compareByName)
.collect(Collectors.toList());
return sortedEmployees;
}
}
这将首先根据员工的姓名对员工进行排序,然后根据年龄对员工进行排序,并且工作正常。现在我希望辅助排序是动态的,所以我做了一个更改,比如
public static List<Employee> sortEmployees(List<Employee> employeeList, String secondarySortField) {
Comparator<Employee> compareByName = Comparator
.comparing(Employee::getName);
if(secondarySortField.equals("age")){
compareByName.thenComparing(Employee::getAge);
}
List<Employee> sortedEmployees = employeeList.stream()
.sorted(compareByName)
.collect(Collectors.toList());
return sortedEmployees;
}
现在年龄排序不起作用,知道为什么会发生这种情况吗?
compareByName.thenComparing()
返回一个新的Comparator
,你不保留它的引用,所以你永远不会使用该Comparator
。
如果应该是:
if(secondarySortField.equals("age")){
compareByName = compareByName.thenComparing(Employee::getAge);
}
同时使用第二个比较器(compareByName.thenComparing(Employee::getAge)
(:
public static List<Employee> sortEmployees(List<Employee> employeeList, String secondarySortField) {
Comparator<Employee> dyanmicComparator = Comparator
.comparing(Employee::getName);
if(secondarySortField.equals("age")){
dyanmicComparator = dyanmicComparator.thenComparing(Employee::getAge); // store the new comparator
}
List<Employee> sortedEmployees = employeeList.stream()
.sorted(dyanmicComparator)
.collect(Collectors.toList());
return sortedEmployees;
}