我是Stream API,Lambdas和Enums的新手,如何使用枚举对列表BYNAME,BYSALARY进行排序?
import java.util.*;
import java.util.function.*;
import java.util.stream.Stream;
class Employee {
String name;
int salary;
Employee(String name,int salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return this.name;
}
public int getSalary() {
return this.salary;
}
public void setName(String name) {
this.name = name;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
class EmployeeInfo {
enum SortMethod {
BYNAME,BYSALARY;
//Do I have to do something here?
};
public List<Employee> sort(List<Employee> emps,final SortMethod method) {
//What I have to Write here?
}
}
我必须定义排序方法以使用枚举返回列表。
这里是一种选择。您可以让Enum为Employee类型实现Comparator接口,然后通过具有提供Comparator的构造函数将Comparator委派给每个元素。然后,您可以使sort函数使用Stream#sorted和enum对象,因为它实现Comparator来处理排序并返回一个新列表,而无需修改旧列表。
enum SortMethod implements Comparator<Employee> {
NAME(Comparator.comparing(Employee::getName)),
SALARY(Comparator.comparingInt(Employee::getSalary));
private final Comparator<Employee> comparator;
SortMethod(Comparator<Employee> comparator) {
this.comparator = comparator;
}
@Override
public int compare(Employee o1, Employee o2) {
return comparator.compare(o1, o2);
}
};
public List<Employee> sort(List<Employee> emps,final SortMethod method){
return emps.stream().sorted(method).collect(Collectors.toList());
}
尝试使员工保持不变。除非您另有需要,否则请始终使对象不变。如果需要更改对象的状态,只需使用旧对象返回一个新对象。
Employee employeeWithRaise = underpaidEmployee.increaseSalary(10_000);
Employee#increaseSalaray可能看起来像这样;
public Employee increaseSalary(int salaryIncrease) {
return new Employee(name, salary + salaryIncrease);
}
可能与Sorting a list with stream.sorted() in Java重复我不明白为什么要使用枚举来查看排序方式。
我将使用两种不同的方法来排序和调用这些方法,当您要使用它们时
emps.stream()
.sort((emp1, emp2)->emp1.getName().compareTo(emp2.getName()));
以及您通过getSalary()更改getName()的位置>
您可以创建两个Comparator类,一个用于比较薪水,另一个用于比较姓名。然后,您可以调用列表上的sort(Comparator)方法以使用该比较器对其进行排序。