Могу ли я сделать это без двух отдельных потоков и без временного сохранения идентификаторов и статусов в HashMap?
SaveStatus saveStatus = saveService.save(input);
Map<Long, SaveStatus> savedStatuses = new HashMap<>();
saveStatus.getSaveStatusResults()
.stream()
.forEach(s -> savedStatuses.put(s.getId(), s.getSavedStatus()));
objectToUpdateWithNewStatuses.getSaveInstructions()
.stream()
.map(SaveInstruction::getTransaction)
.forEach(t -> t.setSaveStatus(savedStatuses.get(t.getId())));
Я думаю, это просто прекрасная логика: savedStatuses как функция сопоставления от id до SaveStatus. Не начинайте с objectToUpdateWithNewStatuses, используя группировку по идентификатору, {идентификатор, набор транзакции), а затем передавайте его в getSaveStatusResults для setSaveStatus. ИМХО это уродливее. Идеально было бы, если бы getSaveStatusResults дал эту карту.




Здесь имеет смысл использовать два разных потока!
Второй поток не принимает в качестве входа / источника карту, собранную из первого потока, это необходимо для быстрого поиска.
Но вы можете улучшить первый поток таким образом:
Map<Long, SaveStatus> savedStatuses =
saveStatus.getSaveStatusResults()
.stream()
.collect(toMap(SaveStatusResult::getId, SaveStatusResult::getSavedStatus));
Используемые ссылки на методы предполагают, что SaveStatus.getSaveStatusResults() возвращает Collection из SaveStatusResult.
И оставьте второй поток, как он определен.
предоставить
SaveStatus,SaveStatusResult,SaveInstruction, а также