按Java 8中的Map列表分组
我有一个像这样的列表:
List<Map>
有没有办法,使用lambda,将此列表转换为:
Map<String, List>
例:
Map m1 = new HashMap(); m1.put("A", 1); m1.put("B", 100); Map m2 = new HashMap(); m2.put("A", 10); m2.put("B", 20); m2.put("C", 100); List<Map> beforeFormatting = new ArrayList(); beforeFormatting.add(m1); beforeFormatting.add(m2);
格式化后:
Map<String, List> afterFormatting;
看起来像是这样的:
A -> [1, 10] B -> [100, 20] C -> [100]
您需要对每个Map的入口集进行flatMap
以创建Stream
。 然后,可以使用groupingBy(classifier, downstream)
收集器收集此Stream:分类器返回条目的键,下游收集器将条目映射到其值并将其收集到List
。
Map> map = list.stream() .flatMap(m -> m.entrySet().stream()) .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
此代码需要以下静态导入:
import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList;
以您的完整示例:
public static void main(String[] args) { Map m1 = new HashMap<>(); m1.put("A", 1l); m1.put("B", 100l); Map m2 = new HashMap<>(); m2.put("A", 10l); m2.put("B", 20l); m2.put("C", 100l); List