我有一个 map 列表。
List<Map<Integer, String>>
列表中的值例如是
<1, String1>
<2, String2>
<1, String3>
<2, String4>
作为最终结果,我想要一个 map >,比如
<1, <String1, String3>>
<2, <String2, String4>>
我如何在 Java 中实现这一点。
代码:
List<Map<Integer, String>> genericList = new ArrayList<Map<Integer,String>>();
for(TrackActivity activity : activityMajor){
Map<Integer, String> mapIdResponse = activity.getMapIdResponse();
genericList.add(mapIdResponse);
}
现在这个 genericList 是这个列表的输入,基于我想要的相同 ids
Map<Integer, List<String>> mapIdResponseList
基本上,要根据 id 合并字符串响应,将具有相同 id 的响应分组到一个列表中,然后创建一个以该 id 作为键并以列表作为其值的新映射。
最佳答案
您可以使用 Java 8 执行以下操作:
private void init() {
List<Map<Integer, String>> mapList = new ArrayList<>();
Map<Integer, String> map1 = new HashMap<>();
map1.put(1, "String1");
mapList.add(map1);
Map<Integer, String> map2 = new HashMap<>();
map2.put(2, "String2");
mapList.add(map2);
Map<Integer, String> map3 = new HashMap<>();
map3.put(1, "String3");
mapList.add(map3);
Map<Integer, String> map4 = new HashMap<>();
map4.put(2, "String4");
mapList.add(map4);
Map<Integer, List<String>> response = mapList.stream()
.flatMap(map -> map.entrySet().stream())
.collect(
Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(
Map.Entry::getValue,
Collectors.toList()
)
)
);
response.forEach((i, l) -> {
System.out.println("Integer: " + i + " / List: " + l);
});
}
这将打印:
Integer: 1 / List: [String1, String3]
Integer: 2 / List: [String2, String4]
解释(非常有必要),恐怕我不能解释每一个细节,你需要了解Stream
的基础知识和 Collectors
Java 8 中首先引入的 API:
- 获得
Stream<Map<Integer, String>>
来自mapList
. - 申请
flatMap
运算符,粗略地将一个流映射到一个已经存在的流中。
在这里:我转换所有Map<Integer, String>
至Stream<Map.Entry<Integer, String>>
并将它们添加到现有流中,因此现在它也是Stream<Map.Entry<Integer, String>>
类型. - 我打算收集
Stream<Map.Entry<Integer, String>>
进入Map<Integer, List<String>>
. - 为此,我将使用
Collectors.groupingBy
,它产生一个Map<K, List<V>>
基于分组函数,Function
映射Map.Entry<Integer, String>
到Integer
在这种情况下。 - 为此,我使用了一个方法引用,它完全符合我的要求,即
Map.Entry::getKey
,它在Map.Entry
上运行并返回Integer
. - 此时我会有一个
Map<Integer, List<Map.Entry<Integer, String>>>
如果我没有做任何额外的处理。 - 为确保获得正确的签名,我必须向
Collectors.groupingBy
添加一个下游,它必须提供一个收集器。 - 对于这个下游,我使用一个收集器来映射我的
Map.Entry
他们的条目String
通过引用的值Map.Entry::getValue
. - 我还需要指定它们是如何收集的,这只是一个
Collectors.toList()
在这里,因为我想将它们添加到列表中。 - 这就是我们得到
Map<Integer, List,String>>
的方式.
关于java - 从 map 列表创建 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527149/