Добавление к существующей карте с помощью Java-потока

#java #java-stream #maps

Вопрос:

 Map<Long, Employee.status> prevStatus = empRecords.stream()
      .collect(Collectors.toMap(employeeRecord::getEmloyeeID,
                                employeeRecord::getEmployeeStatus));
 

У меня уже есть приведенный выше код, мне нужно добавить аналогичную операцию, но вместо создания новой карты я хочу добавить результат к существующей карте.

 prevStatus = empRecords.stream()
      .collect(Collectors.**toMap**(employeeRecord::getEmloyeeID,
                                    employeeRecord::**getUSEmployeeStatus**));
 

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

1. Возможно, вам следует просто использовать forEach вместо сбора и позвонить prevStatus.put . В качестве альтернативы вы можете обернуть свой второй конвейер потока prevStatus.putAll() (но вам, возможно, придется убедиться prevStatus , что он не является неизменяемым (возможно, указав, какой класс карты использовать на шаге 1)

2. Вместо того, чтобы создавать и помещать вручную, мы можем использовать существующие коллекторы.toMap() сам по себе с дополнительными аргументами. Проверьте Мой ответ. Это может быть именно то, чего вы хотите.

Ответ №1:

Вы можете создать новую Map и добавить ее записи в существующую Map :

 prevStatus.putAll(
    empRecords.stream()
              .collect(Collectors.toMap(employeeRecord::getEmloyeeID,
                                        employeeRecord::getUSEmployeeStatus)));
 

Или вы можете использовать forEach вместо collect :

 empRecords.stream()
          .forEach(emp -> prevStatus.put(emp.getEmloyeeID (),
                                         emp.getEmployeeStatus()));
 

Ответ №2:

Это ожидаемый код

 empRecords.stream()
                  .collect(Collectors.toMap(employeeRecord::getEmloyeeID,
                                            employeeRecord::getEmployeeStatus,(newVal,oldVal)->newVal,()->existingMap));
 

Где (newVal,oldVal)->newVal логика для того, что, если ключ уже присутствует на существующей карте и
existingMap является вашей существующей картой. Убедитесь, что значение existingMap не равно нулю. Если он равен нулю, то с новой хэш-картой, которой вы поделились в своем коде, все в порядке.