Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
Ich bekomme, java.lang.IllegalStateException: Duplicate key
wenn ein dupliziertes Element gefunden wird.
Ist es möglich, eine solche Ausnahme beim Hinzufügen von Werten zur Karte zu ignorieren?
Wenn es ein Duplikat gibt, sollte es einfach fortgesetzt werden, indem dieser doppelte Schlüssel ignoriert wird.
java
java-8
java-stream
Patan
quelle
quelle
Antworten:
Dies ist möglich mit dem
mergeFunction
ParameterCollectors.toMap(keyMapper, valueMapper, mergeFunction)
:mergeFunction
ist eine Funktion, die mit zwei Werten arbeitet, die derselben Taste zugeordnet sind.adress1
entspricht der ersten Adresse, die beim Sammeln von Elementen angetroffen wurde, undadress2
entspricht der zweiten gefundenen Adresse: Dieses Lambda weist nur an, die erste Adresse beizubehalten, und ignoriert die zweite.quelle
null
. Siehe toMap-Dokument , das auf das Zusammenführen eines Dokuments verweist , das angibt. Wenn die Neuzuordnungsfunktion null zurückgibt, wird die Zuordnung entfernt.Wie in JavaDocs gesagt :
Also solltest du
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
stattdessen verwenden. Stellen Sie einfach eine Zusammenführungsfunktion bereit , die bestimmt, welches der Duplikate in die Karte eingefügt wird.Wenn es Ihnen zum Beispiel egal ist, welches, rufen Sie einfach an
quelle
Die @ alaster-Antwort hilft mir sehr, aber ich möchte eine aussagekräftige Information hinzufügen, wenn jemand versucht, die Information zu gruppieren.
Wenn Sie beispielsweise zwei Produkte mit jeweils
Orders
gleichen,code
aber unterschiedlichenquantity
Produkten haben und Ihr Wunsch darin besteht, die Mengen zu summieren , können Sie Folgendes tun:Ergebnis:
quelle
Zum Gruppieren nach Objekten
quelle
Stellen Sie sicher, dass Ihre keyMapper-Funktion keine Nullwerte zurückgibt, wenn dieses Problem auftritt , ohne dass doppelte Schlüssel in der Map gestreamt werden .
Es ist sehr ärgerlich, dies aufzuspüren, da der Fehler "Schlüssel 1 duplizieren" anzeigt, wenn 1 tatsächlich der Wert des Eintrags anstelle des Schlüssels ist.
In meinem Fall hat meine keyMapper-Funktion versucht, Werte in einer anderen Zuordnung nachzuschlagen, aber aufgrund eines Tippfehlers in den Zeichenfolgen wurden Nullwerte zurückgegeben.
quelle
Ich habe ein solches Problem beim Gruppieren von Objekten festgestellt. Ich habe sie immer auf einfache Weise gelöst: Führen Sie einen benutzerdefinierten Filter mit java.util.Set aus, um doppelte Objekte mit einem beliebigen Attribut Ihrer Wahl als unten zu entfernen
Hoffe das hilft jedem, der das gleiche Problem hat!
quelle
Angenommen, Sie haben Personen, ist die Liste der Objekte
Jetzt brauchen Sie zwei Schritte:
1)
2)
Hier ist eine Methode zum Entfernen von Duplikaten
Hier ein vollständiges Beispiel hinzufügen
Ergebnisse :
quelle