java - 我正在尝试查找每个部门最新员工的薪水。一步使用 java 8

标签 java java-8 java-stream collectors maxby

考虑到员工 ID 会增加,目的是找到部门中最新员工的薪资。 我已经编写了一个两步代码,我正在尝试找到一个可以使用 java8 在一个步骤中完成此操作的解决方案。

我的流程是:

  1. 获取“部门” map :根据该部门中最大的 EmployeeId 获取“最新员工”
  2. 使用上一个 map 创建“Department”:“Salary of the Newest Employee”(这是输出)

是否可以一步完成?

    public static void main(String[] args) {
    List<Employee> employees = new ArrayList<>();
    Employee e1 = new Employee(1, 1000, "a1", "A");
    Employee e2 = new Employee(2, 1010, "b1", "A");
    Employee e3 = new Employee(3, 1000, "a1", "B");
    Employee e4 = new Employee(4, 500, "b2", "B");
    Employee e5 = new Employee(5, 2000, "a1", "C");
    Employee e6 = new Employee(6, 5000, "b2", "C");
    employees.add(e1);
    employees.add(e2);
    employees.add(e3);
    employees.add(e4);
    employees.add(e5);
    employees.add(e6);
    //This Map will contain Department and The newest Employee in that Department.
    Map<String, Employee> retVal = employees.stream()
            .collect(groupingBy(
                    e -> e.getDepartment(),
                    collectingAndThen(maxBy(comparingInt(e -> e.getEmployeeId())), Optional::get)
            ));
    //This Map will use the previous map to construct a combination of "Department" : "Salary of the newest Member"
    Map<String, Integer> map = new HashMap<>();
    retVal.entrySet().forEach(stringEmployeeEntry -> {
        map.put(stringEmployeeEntry.getKey(), stringEmployeeEntry.getValue().getSalary());
    });
}

输出

{
  "a1" : 2000,
  "b1" : 1010,
  "b2" : 5000, 
}

最佳答案

您可以直接从Employee对象映射collectingAndThen中的工资

Map<String, Integer> retVal = employees.stream()
            .collect(Collectors.groupingBy(
                    e -> e.getDepartment(),
                    Collectors.collectingAndThen(
                         Collectors.maxBy(Comparator.comparingInt(e -> e.getEmployeeId())),
                         e -> e.get().getSalary())
            ));

关于java - 我正在尝试查找每个部门最新员工的薪水。一步使用 java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64194436/

相关文章:

java - 无法在 JBoss 上使用 JNDI 数据源获取数据库连接

java - 上下文相关菜单 - Java ME

java - RichFaces 丰富 :tree nodeSelectListener not being listened to

java - 流<字符串> 到映射<字符串、整数>

list - 有没有办法用java 8流更改日期格式?

Java Streams — 如何每第 n 个项目执行一个中间函数

java - 游戏框架 1.4.1 : Play dependencies don't download

Java8动态代理和默认方法

Java 8 Stream API toMap 转换为 TreeMap

java - 如何通过其参数查找并收集要映射的对象?