java - Java收集返回顶级项目的嵌套地图流
问题描述
我有以下模型:
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>
where:
- 关键:
id
在subItem.ids
- 价值:
AdditionalParams
为此id
我假设 id 是唯一的,因此在向 Map 添加元素时不会有任何冲突。
我的解决方案
我尝试使用flatMap
with 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>
?
解决方案
您可以做些什么来解决这个问题,将中间状态映射到映射的条目,然后收集它们。这会像 -
Map<String, AdditionalParams> result = allItems
.stream()
.flatMap(item -> item.getSubItems().stream()
.flatMap(subItem -> subItem.getIds()
.stream()
.map(id -> new AbstractMap.SimpleEntry<>(
id, new AdditionalParams(item.getName(),
subItem.getName())))))
.collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue));
推荐阅读
- php - 无法使用 PHP ARC2 SPARQL 从土地注册 api 数据中获取数据
- python - 在 Python 中拆分 Json 数组
- matlab - 如何在 MATLAB 中通过 UDP 发送大量数字?
- c++11 - 如何指定整数数组作为编译器命令行定义 -D
- android - 如何使用适用于 Android 和 iOS 的 Delphi 10.3 (Firemonkey) 应用程序检查蓝牙适配器的状态(开/关)
- postgresql - 无法使用 psql 连接到 Pgbouncer
- html - 为什么我的 HERO 不显示带有文本的图像?
- gradle - Gradle 的 Script 对象 Logger 配置在哪里?
- python - /admin/budget/expense/add/ 处的 OperationalError
- python - TclError:无效的命令名称“.!frame.!canvas”