Java 中比较器的问题



我有一个员工类,如下所示

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;
}

最新更新