How to putAll on Java hashMap contents of one to another, but not replace existing keys and values?

后端 未结 7 1634
猫巷女王i
猫巷女王i 2020-12-01 00:20

I need to copy all keys and values from one A HashMap onto another one B, but not to replace existing keys and values.

Whats the best way to do that?

I was t

相关标签:
7条回答
  • 2020-12-01 01:00

    As others have said, you can use putIfAbsent. Iterate over each entry in the map that you want to insert, and invoke this method on the original map:

    mapToInsert.forEach(originalMap::putIfAbsent);
    
    0 讨论(0)
  • 2020-12-01 01:10

    Using Guava's Maps class' utility methods to compute the difference of 2 maps you can do it in a single line, with a method signature which makes it more clear what you are trying to accomplish:

    public static void main(final String[] args) {
        // Create some maps
        final Map<Integer, String> map1 = new HashMap<Integer, String>();
        map1.put(1, "Hello");
        map1.put(2, "There");
        final Map<Integer, String> map2 = new HashMap<Integer, String>();
        map2.put(2, "There");
        map2.put(3, "is");
        map2.put(4, "a");
        map2.put(5, "bird");
    
        // Add everything in map1 not in map2 to map2
        map2.putAll(Maps.difference(map1, map2).entriesOnlyOnLeft());
    }
    
    0 讨论(0)
  • 2020-12-01 01:13

    Just iterate and add:

    for(Map.Entry e : a.entrySet())
      if(!b.containsKey(e.getKey())
        b.put(e.getKey(), e.getValue());
    

    Edit to add:

    If you can make changes to a, you can also do:

    a.putAll(b)
    

    and a will have exactly what you need. (all the entries in b and all the entries in a that aren't in b)

    0 讨论(0)
  • 2020-12-01 01:15

    With Java 8 there is this API method to accomplish your requirement.

    map.putIfAbsent(key, value)
    

    If the specified key is not already associated with a value (or is mapped to null) associates it with the given value and returns null, else returns the current value.

    0 讨论(0)
  • 2020-12-01 01:19
    public class MyMap {
    
    public static void main(String[] args) {
    
        Map<String, String> map1 = new HashMap<String, String>();
        map1.put("key1", "value1");
        map1.put("key2", "value2");
        map1.put("key3", "value3");
        map1.put(null, null);
    
        Map<String, String> map2 = new HashMap<String, String>();
        map2.put("key4", "value4");
        map2.put("key5", "value5");
        map2.put("key6", "value6");
        map2.put("key3", "replaced-value-of-key3-in-map2");
        // used only if map1 can be changes/updates with the same keys present in map2.
        map1.putAll(map2);
    
        // use below if you are not supposed to modify the map1.
        for (Map.Entry e : map2.entrySet())
            if (!map1.containsKey(e.getKey()))
                map1.put(e.getKey().toString(), e.getValue().toString());
        System.out.println(map1);
    }}
    
    0 讨论(0)
  • 2020-12-01 01:24

    It looks like you are willing to create a temporary Map, so I'd do it like this:

    Map tmp = new HashMap(patch);
    tmp.keySet().removeAll(target.keySet());
    target.putAll(tmp);
    

    Here, patch is the map that you are adding to the target map.

    Thanks to Louis Wasserman, here's a version that takes advantage of the new methods in Java 8:

    patch.forEach(target::putIfAbsent);
    
    0 讨论(0)
提交回复
热议问题