Java 8映射按键分组的地图列表

时间:2019-04-01 15:54:51

标签: java java-8 java-stream grouping

我有以下内容: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分组。

1 个答案:

答案 0 :(得分:2)

Collectors.groupingByCollectors.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())));