Я пытаюсь найти зарплату самого нового сотрудника для каждого отдела. Использование java 8 за один шаг

#java #java-8 #java-stream #collectors #maxby

#java #java-8 #java-stream #коллекторы #maxby

Вопрос:

Цель состоит в том, чтобы найти зарплату самого нового сотрудника в отделе, учитывая, что идентификатор сотрудника увеличится. Я написал двухэтапный код и пытаюсь найти решение, которое может сделать это за один шаг, используя java8.

Мой процесс:

  1. получите карту «Отдела»: «Новейший сотрудник» на основе крупнейшего идентификатора сотрудника в этом отделе
  2. Используйте предыдущую карту, чтобы создать «Отдел»: «Зарплата самого нового сотрудника» (это результат)

Возможно ли будет сделать это за один шаг?

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

Ответ №1:

Вы можете напрямую сопоставить зарплату с collectingAndThen Employee объектом from

 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())
            ));
  

Комментарии:

1. Спасибо, полностью пропустил эту часть.. Теперь работает нормально

2. Честно говоря, использование статического импорта Collectors для меня менее читаемо (конечно, это дело вкуса). Не могли бы вы хотя бы упомянуть об этом? На этот сайт приходят новички 🙂