[英]Java 8 streams - merge a collection of Maps
假设我有一个带有以下签名的方法:
Map<String, String> merge (String[][] ... maps)
它需要(variadic)数量的两个dim数组来表示映射,例如:
String[][] m1 = new String[][] {
{"k1", "a"},
{"k2", "b"}
};
String[][] m2 = new String[][] {
{"k1", "a"},
{"k2", "b"},
{"k3", "c"}
};
String[][] m3 = new String[][] {
{"k1", "x"},
{"k2", "b"}
};
现在我可以像这样从左到右合并任意两张地图:
Map<String, String> m1 = Stream.of(map1).collect(Collectors.toMap(k -> k[0], v -> v[1]));
Map<String, String> m2 = Stream.of(map2).collect(Collectors.toMap(k -> k[0], v -> Optional.ofNullable(v[1]).orElse("null")));
m1.forEach((key, value) -> m2.merge(key, value, (v1, v2) -> v1));
但是我怎样才能合并一个可变数量的这种数组映射,以便在传递m1, m2, m3
定义如下:
String[][] m3 = new String[][] {
{"k1", "x"},
{"k2", "b"}
{"k3", "c"}
};
如果我正确理解你的问题,这很简单。 你只需要平面映射所有条目并收集到映射,使用合并函数选择后面的值:
Map<String, String> merge (String[][] ... maps) {
return Arrays.stream(maps)
.flatMap(Arrays::stream)
.collect(Collectors.toMap(a -> a[0], a -> a[1], (a, b) -> b));
}
如果要将其转换回数组,则可以执行此操作
String[][] m3 = merge(maps)
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(), e.getValue() })
.toArray(String[][]::new);
Map<String, String> merge(String[][]... maps) {
return Stream.of(maps)
.flatMap(Arrays::stream) //flatten all maps into a single stream
.map(s -> Map.entry(s[0], s[1])) //convert array to Entry
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(o1, o2) -> o2));
}
编辑 :无需转换为Entry。 我们可以直接收集地图,如@shmosel所示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.