java - 如何使用泛型有效地合并包含相同类型的两个Map对象,并控制在有重复的情况下会发生什么(如果值为String,则添加或乘以值为Integer和Concat)?
答案 0 :(得分:1)
使用Map.merge
:
for (Map.Entry<K, V> entry : map2.entrySet()) {
map1.merge(entry.getKey(), entry.getValue(), (oldV, newV) -> /* some expression to combine old and new values */);
}
如果您使用的是Java 7或更早版本,则上述链接文档将说明如何在没有Java 8功能的情况下实现它(在“实施要求”部分中)。
答案 1 :(得分:-1)
您可以尝试以下示例:
Map<String, Integer> map1 = new HashMap<>();
map1.put("Java", 7);
map1.put("C#", 4);
Map<String, Integer> map2 = new HashMap<>();
map2.put("Java", 3);
map1.put("Scala", 5);
map1.keySet().forEach(e -> {
map2.computeIfPresent(e, (String key,Integer value)-> value+map1.get(key));
map2.putIfAbsent(e, map1.get(e));
});
System.out.println(map2);
修改强> 如果您想处理所有用例,那么您可以执行以下操作。
Map<String, Object> map1 = new HashMap<>();
map1.put("Java", 7);
map1.put("C#", 4);
Map<String, Object> map2 = new HashMap<>();
map2.put("Java", 3);
map1.put("Scala", 5);
map1.keySet().forEach(e -> {
map2.computeIfPresent(e, (String key, Object value) -> {
if (value instanceof Integer)
return Integer.sum((Integer) value, (Integer) map1.get(key));
if (value instanceof String) {
String s1 = (String) value;
String s2 = (String) map1.get(key);
return s1.concat(s2);
}
return null;
});
map2.putIfAbsent(e, map1.get(e));
});
System.out.println(map2);