用Java8流API合并两个Map<String,Integer>
我有两个(或更多)Map<String, Integer>
对象。我希望将它们与Java8流API合并,使公共键的值应该是这些值中的最大值
@Test
public void test14() throws Exception {
Map<String, Integer> m1 = ImmutableMap.of("a", 2, "b", 3);
Map<String, Integer> m2 = ImmutableMap.of("a", 3, "c", 4);
List<Map<String, Integer>> list = newArrayList(m1, m2);
Map<String, Integer> mx = list.stream()... // TODO
Map<String, Integer> expected = ImmutableMap.of("a", 3, "b", 3, "c", 4);
assertEquals(expected, mx);
}
如何使此测试方法变为绿色
我已经玩了collect
和Collectors
一阵子都没有成功
(ImmutableMap
和newArrayList
来自谷歌番石榴。)
# 1 楼答案
# 2 楼答案
我在proton pack library中添加了我的贡献,其中包含流API的实用方法。以下是你如何实现自己的目标:
基本上
mergeKeys
将在一个新映射中收集键值对(提供一个可选的合并函数,否则最终将得到一个Map<String, List<Integer>>
),并在entrySet()
上调用stream()
以获得一个新的MapStream
。然后使用collect()
获得结果图# 3 楼答案
我已经为可能感兴趣的任何人创建了@srborlongan所做工作的视觉表现
# 4 楼答案
这涵盖了任何大小列表的一般情况,应该适用于任何类型,只需根据需要交换
Integer::max
和/或HashMap::new
如果您不在乎合并中会出现哪个值,那么有一个更简洁的解决方案:
作为一般方法:
# 5 楼答案
# 6 楼答案
使用StreamEx可以执行以下操作: