La fusion des deux Map<String, Integer> avec Java 8 Flux API
J'ai deux (ou plus) Map<String, Integer>
objets. Je voudrais les fusionner avec Java 8 Flux API de façon que les valeurs de clés communs devrait être le maximum des valeurs.
@Test
public void test14() throws Exception {
Map<String, Integer> m1 = ImmutableMap.of("a", 2, "b", 3);
Map<String, Integer> m2 = ImmutableMap.of("a", 3, "c", 4);
List<Map<String, Integer>> list = newArrayList(m1, m2);
Map<String, Integer> mx = list.stream()... //TODO
Map<String, Integer> expected = ImmutableMap.of("a", 3, "b", 3, "c", 4);
assertEquals(expected, mx);
}
Comment puis-je faire de cette méthode d'essai vert?
J'ai joué avec collect
et Collectors
pour un certain temps sans succès.
(ImmutableMap
et newArrayList
sont à partir de Google de Goyave.)
Vous devez vous connecter pour publier un commentaire.
Ce couvre le cas général, quelle que soit la taille de la liste et devrait fonctionner avec tous les types, il vous suffit de changer la
Integer::max
et/ouHashMap::new
comme souhaité.Si vous n'avez pas de soins dont la valeur vient de sortir dans un processus de fusion, il y a beaucoup plus propre solution:
Et méthodes génériques:
J'ai créé une représentation visuelle de ce que @srborlongan fait, pour toute personne qui pourrait être intéressée.
J'ai ajouté ma contribution à la proton pack bibliothèque qui contient les méthodes de l'utilitaire pour le Flux de données de l'API. Voici comment vous pouvez obtenir ce que vous voulez:
Fondamentalement
mergeKeys
permettra de recueillir les paires clé-valeur dans une nouvelle carte (en fournissant une fonction de fusion est facultatif, vous vous retrouverez avec unMap<String, List<Integer>>
autrement) et le rappelstream()
sur leentrySet()
pour obtenir une nouvelleMapStream
. Ensuite, utilisezcollect()
pour obtenir la carte.À l'aide de StreamEx que vous pouvez faire: