您可以使用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); });}这将打印:
整数:1 /列表:[String1,String3]
整数:2 /列表:[ String2 ,String4]
说明(非常有必要),恐怕我无法解释每个细节,您需要首先了解Java 8中引入的
Stream和
CollectorsAPI 的基础:
Stream<Map<Integer, String>>
从中获取mapList
。应用
flatMap
运算符,该运算符将流大致映射到现有流中。
在这里:我将全部转换Map<Integer, String>
为Stream<Map.Entry<Integer,String>>
并将它们添加到现有流,因此现在它也是typeStream<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
对a进行操作Map.Entry
并返回Integer
。 Map<Integer, List<Map.Entry<Integer, String>>>
如果不做任何额外的处理,这时我将拥有一个。- 为了确保获得正确的签名,我必须在中添加一个下游,该下游必须
Collectors.groupingBy
提供一个收集器。 - 对于此下游,我使用一个收集器,该收集器通过引用将我的
Map.Entry
条目映射到它们的String
值Map.Entry::getValue
。 - 我还需要指定如何收集它们,这只是
Collectors.toList()
这里,因为我想将它们添加到列表中。 - 这就是我们得到的
Map<Integer, List,String>>
。



