Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
J'obtiens java.lang.IllegalStateException: Duplicate key
lorsqu'un élément dupliqué est trouvé.
Est-il possible d'ignorer une telle exception lors de l'ajout de valeurs à la carte?
Lorsqu'il y a un doublon, il devrait simplement continuer en ignorant cette clé en double.
java
java-8
java-stream
Patan
la source
la source
Réponses:
Ceci est possible en utilisant le
mergeFunction
paramètre deCollectors.toMap(keyMapper, valueMapper, mergeFunction)
:mergeFunction
est une fonction qui opère sur deux valeurs associées à la même touche.adress1
correspond à la première adresse rencontrée lors de la collecte des éléments etadress2
correspond à la deuxième adresse rencontrée: cette lambda indique simplement de conserver la première adresse et ignore la seconde.la source
null
. Voir doc toMap qui pointe pour fusionner le doc qui indique si la fonction de remappage renvoie null, le mappage est supprimé.Comme dit dans JavaDocs :
Vous devez donc utiliser à la
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
place. Fournissez simplement une fonction de fusion , qui déterminera lequel des doublons sera placé dans la carte.Par exemple, si vous ne vous souciez pas lequel, appelez simplement
la source
La réponse @alaster m'aide beaucoup, mais je voudrais ajouter une information significative si quelqu'un essaie de regrouper l'information.
Si vous en avez par exemple deux
Orders
avec des produits identiquescode
mais différentsquantity
pour chacun, et que votre désir est de faire la somme des quantités, vous pouvez faire:Résultat:
la source
Pour toute autre personne rencontrant ce problème mais sans que les clés en double dans la carte ne soient diffusées, assurez-vous que votre fonction keyMapper ne renvoie pas de valeurs nulles .
Il est très ennuyeux de retrouver cela car l'erreur indiquera "Duplicate key 1" lorsque 1 est en fait la valeur de l'entrée au lieu de la clé.
Dans mon cas, ma fonction keyMapper a essayé de rechercher des valeurs dans une carte différente, mais en raison d'une faute de frappe dans les chaînes, elle renvoyait des valeurs nulles.
la source
Pour regrouper par objets
la source
J'ai rencontré un tel problème lors du regroupement d'objets, je les ai toujours résolus d'une manière simple: effectuez un filtre personnalisé en utilisant un java.util.Set pour supprimer l'objet en double avec l'attribut de votre choix comme ci-dessous
J'espère que cela aide toute personne ayant le même problème!
la source
En supposant que vous avez des personnes est une liste d'objets
Maintenant, vous avez besoin de deux étapes:
1)
2)
Voici la méthode pour supprimer les doublons
Ajout d'un exemple complet ici
Résultats :
la source