我有以下内容:List<Map<String, Object>>
。我想使用流获取Map<String, List<Object>
。此映射的键将是在列表中重复的键。基本上是一对多的,这将是数据的示例:
[
{ id: "a", name: "AAA"}
{ id: "a", name: "BBB"}
{ id: "b", name: "XXX"}
{ id: "b", name: "YYY"}
]
我想获得:
{
a: ["AAA", "BBB"],
b: ["XXX", "YYY"]
}
因此,此新地图正在按上一个列表中的ID分组。
答案 0 :(得分:2)
将Collectors.groupingBy
与Collectors.mapping
一起使用:
Map<String, List<Object>> result = listOfMaps.stream()
.collect(Collectors.groupingBy(map -> map.get("id").toString(),
Collectors.mapping(map -> map.get("name"),
Collectors.toList())));
Collectors.groupingBy
创建所需的地图,而Collectors.mapping
通过将映射函数应用于流的每个元素,使收集器适应另一个地图。 (在这种情况下,它首先通过将流的每个映射转换为映射到"name"
键的值来收集到列表。)
如果需要,可以将上面的代码修改为跳过没有使用"id"
键输入的地图:
Map<String, List<Object>> result = listOfMaps.stream()
.filter(map -> map.get("id") != null))
.collect(Collectors.groupingBy(map -> map.get("id").toString(),
Collectors.mapping(map -> map.get("name"),
Collectors.toList())));