Si vous savez que vous n'avez pas de clés dupliquées, ou si vous voulez que les valeurs dans le fichier map2
pour écraser les valeurs de map1
pour les clés dupliquées, vous pouvez simplement écrire
map3 = new HashMap<>(map1);
map3.putAll(map2);
Si vous avez besoin de plus de contrôle sur la façon dont les valeurs sont combinées, vous pouvez utiliser la commande Map.merge
ajouté à Java 8, qui utilise un fichier de données de l'utilisateur. BiFunction
pour fusionner les valeurs des clés dupliquées. merge
opère sur des clés et des valeurs individuelles, vous devrez donc utiliser une boucle ou une fonction Map.forEach
. Ici, nous concaténons les chaînes de caractères pour les clés dupliquées :
map3 = new HashMap<>(map1);
for (Map.Entry<String, String> e : map2.entrySet())
map3.merge(e.getKey(), e.getValue(), String::concat);
//or instead of the above loop
map2.forEach((k, v) -> map3.merge(k, v, String::concat));
Si vous savez que vous n'avez pas de clés en double et que vous voulez le faire respecter, vous pouvez utiliser une fonction de fusion qui lance un message d'erreur de type AssertionError
:
map2.forEach((k, v) ->
map3.merge(k, v, (v1, v2) ->
{throw new AssertionError("duplicate values for key: "+k);}));
En prenant du recul par rapport à cette question spécifique, la bibliothèque des flux de Java 8 fournit toMap
y groupingBy
Collectionneurs . Si vous fusionnez de façon répétée des cartes dans une boucle, vous pouvez peut-être restructurer votre calcul pour utiliser des flux, ce qui peut à la fois clarifier votre code et permettre un parallélisme facile en utilisant un flux parallèle et un collecteur concurrent.