Si vous savez que vous n'avez pas les clés en double, ou si vous voulez valeurs map2
pour les valeurs de écrasent map1
pour les clés en double, 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 Map.merge
, ajouté dans Java 8, qui utilise un BiFunction
fourni par l'utilisateur pour fusionner les valeurs pour les clés en double. merge
fonctionne sur des clés et des valeurs individuelles, vous devrez donc utiliser une boucle ou Map.forEach
. Ici, nous concaténer des chaînes pour les clés en double:
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 les clés en double et que vous voulez appliquer, vous pouvez utiliser une fonction de fusion qui jette un AssertionError
:
map2.forEach((k, v) ->
map3.merge(k, v, (v1, v2) ->
{throw new AssertionError("duplicate values for key: "+k);}));
Prise un retour en arrière de cette question spécifique, la bibliothèque de flux Java 8 fournit toMap
et groupingBy
Collectors.Si vous fusionnez à plusieurs reprises des cartes dans une boucle, vous pouvez 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.
Vous n'avez pas indiqué ce que vous voulez faire si une clé existe dans les deux cartes. –
Java 8 a map1.merge (map2) –
@SambitTripathy, avez-vous un lien pour les documents sur ce sujet? Je n'arrive pas à le trouver. – JohnK