Java Language Fusion, combinaison et composition de cartes


Exemple

Utilisez putAll pour mettre chaque membre d'une carte dans une autre. Les clés déjà présentes dans la carte auront leurs valeurs correspondantes écrasées.

Map<String, Integer> numbers = new HashMap<>();
numbers.put("One", 1)
numbers.put("Three", 3)
Map<String, Integer> other_numbers = new HashMap<>();
other_numbers.put("Two", 2)
other_numbers.put("Three", 4)

numbers.putAll(other_numbers)

Cela donne la cartographie suivante en numbers :

"One" -> 1
"Two" -> 2
"Three" -> 4 //old value 3 was overwritten by new value 4

Si vous souhaitez combiner des valeurs au lieu de les écraser, vous pouvez utiliser Map.merge , ajouté à Java 8, qui utilise une fonction BiFunction fournie par l' BiFunction pour fusionner les valeurs des clés en double. merge opère sur des clés et des valeurs individuelles, vous devrez donc utiliser une boucle ou Map.forEach . Ici, nous concaténons des chaînes pour des clés en double:

for (Map.Entry<String, Integer> e : other_numbers.entrySet())
    numbers.merge(e.getKey(), e.getValue(), Integer::sum);
//or instead of the above loop
other_numbers.forEach((k, v) -> numbers.merge(k, v, Integer::sum));

Si vous souhaitez appliquer la contrainte, il n'y a pas de clés en double, vous pouvez utiliser une fonction de fusion qui renvoie une AssertionError :

mapA.forEach((k, v) ->
    mapB.merge(k, v, (v1, v2) ->
        {throw new AssertionError("duplicate values for key: "+k);}));

Composer la carte <X, Y> et la carte <Y, Z> pour obtenir la carte <X, Z>

Si vous voulez composer deux mappages, vous pouvez le faire comme suit

    Map<String, Integer> map1 = new HashMap<String, Integer>();
    map1.put("key1", 1);
    map1.put("key2", 2);
    map1.put("key3", 3);
    
    Map<Integer, Double> map2 = new HashMap<Integer, Double>();
    map2.put(1, 1.0);
    map2.put(2, 2.0);
    map2.put(3, 3.0);

    Map<String, Double> map3 = new new HashMap<String, Double>();
    map1.forEach((key,value)->map3.put(key,map2.get(value)));

Cela donne la cartographie suivante

    "key1" -> 1.0
    "key2" -> 2.0
    "key3" -> 3.0