如何使用枚举常量对Employee对象进行排序?

问题描述 投票:-2回答:3

我是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?
    }
}

我必须定义排序方法以使用枚举返回列表。

java lambda enums java-stream
3个回答
3
投票

这里是一种选择。您可以让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);
}

1
投票

可能与Sorting a list with stream.sorted() in Java重复我不明白为什么要使用枚举来查看排序方式。

我将使用两种不同的方法来排序和调用这些方法,当您要使用它们时

emps.stream() 
    .sort((emp1, emp2)->emp1.getName().compareTo(emp2.getName())); 

以及您通过getSalary()更改getName()的位置>


1
投票

您可以创建两个Comparator类,一个用于比较薪水,另一个用于比较姓名。然后,您可以调用列表上的sort(Comparator)方法以使用该比较器对其进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.