【问题标题】:Java 8 Mapping a list of maps grouping by a keyJava 8映射按键分组的映射列表
【发布时间】:2019-04-01 15:54:50
【问题描述】:

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

【问题讨论】:

  • IMO 使用对象而不是Map,因为它的过程很简单。 class MyObject{ String id; String name;} 并使用以下代码来获得最终结果:list.stream() .collect(Collectors.groupingBy(MyObject::getId, Collectors.mapping(MyObject::getName, Collectors.toList())));

标签: java java-8 java-stream grouping


【解决方案1】:

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())));

【讨论】:

  • @user1990218 De nada, arriba!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 2015-02-11
  • 2016-02-12
相关资源
最近更新 更多