#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 не равно нулю. Если он равен нулю, то с новой хэш-картой, которой вы поделились в своем коде, все в порядке.