我有以下模型:
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>
(键:subItem.ids中的id,值:该id的AdditionalParams)。
我假设ID是唯一的,所以在向地图添加元素时不会有任何冲突。
我的解决方案
我尝试将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(...
)不起作用(或者我做错了)。我尝试遵循此答案Convert List of Maps to single Map via streams,但也无法使其正常工作。
我的方法在做什么错?如何获得Map<String, AdditionalParams>
类型的结果?
还有如何使它更清洁/更快/更好? ((我知道我的解决方案远非完美)。
您可以采取的解决措施是将中间状态映射到映射的条目,然后收集它们。就像-