Преобразование Map, List> в Map>

Есть часть кода; в ней я из ответа сервиса должен вытянуть 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 шт):

Автор решения: Nowhere Man

Следует применить 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())
    ));
→ Ссылка