如何使用泛型组合包含相同类型的两个HashMap对象,并控制重复时发生的情况

时间:2018-02-11 08:28:36

标签: java generics

java - 如何使用泛型有效地合并包含相同类型的两个Map对象,并控制在有重复的情况下会发生什么(如果值为String,则添加或乘以值为Integer和Concat)?

2 个答案:

答案 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);