У меня следующая модель:
class Item {
String name;
...
List<SubItem> subItems;
}
class SubItem {
String name;
...
List<String> ids;
}
Для каждого id
в subItem.ids
я хотел бы извлечь некоторые параметры верхнего уровня. Для этого я определил собственный кортеж:
class AdditionalParams {
private final String itemName;
private final String subItemName;
...
}
Цель - вернуть Map<String, AdditionalParams>
(ключ: id в subItem.ids, значение: AdditionalParams для этого идентификатора).
I Предположим, что идентификаторы уникальны, поэтому при добавлении элементов на карту не будет конфликтов.
Мое решение
Я пытался использовать flatMap
с Collectors.toMap
:
List<Item> allItems = ...
Map<String, AdditionalParams> result = allItems
.stream()
.flatMap(i -> i.getSubItems()
.stream()
.map(si -> si.getIds()
.stream()
.collect(
Collectors.toMap(
Function.identity(),
id -> new AdditionalParams(i.getName(), si.getName())
)
)
)
) // Stream< Map<String, AdditionalParams> >
.collect(
Collectors.toMap(m -> m.getKey(), m -> m.getValue())
)
Проблема в том, что последняя строка (.collect(Collectors.toMap(...
) не работает (или я делаю не так). Я попытался последовать этому ответу Преобразовать список карт в отдельную карту через потоки , но также не смог заставить его работать.
Что я делаю не так со своим подходом? Как мне получить результат типа Map<String, AdditionalParams>
?
А как еще сделать его чище / быстрее / лучше? (я знаю, что мое решение далеко от совершенства) .