Преобразование Map, List
Есть часть кода; в ней я из ответа сервиса должен вытянуть Map следующего вида:
Map<Specialization, List<SpecialistInfo>> specialistsMap = specialistsResponse.getSpecialists().stream().collect(groupingBy(SpecialistInfo::getSpecializations));
Но по факту из этого стрима возвращается Map<List<Specialization>, List<SpecialistInfo>>.
Метод getSpecialists() возвращает List<SpecialistInfo> specialists;и каждый из объектов SpecialistInfo содержит список в себе. То есть метод getSpecializations тоже возвращает List<Specialization> specializations
Мне нужно сгруппировать эту мапу в мапу вида Map<Specialization, List<SpecialistInfo>>.
Как я могу это сделать через stream API?
Ответы (1 шт):
Следует применить Stream::flatMap к стриму, полученному из списка специализаций и преобразовать его в поток неких пар Pair<Specialization, SpecialistInfo>, или же пар "ключ-значение" при помощи Map.entry.
Затем выполняется обычная группировка по ключу с использованием вложенного коллектора Collectors.mapping:
List<SpecialistInfo> data = specialistsResponse.getSpecialists();
Map<Specialization, List<SpecialistInfo>> specialistsMap = data
.stream() // Stream<SpecialistInfo>
.flatMap(info -> info.getSpecializations()
.stream().map(spec -> Map.entry(spec, info))
) // Stream<Map.Entry<Specialization, SpecialistInfo>>
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())
));