2015-03-24 3 views
9

Ich erstelle eine HashMap mit java8 stream API wie folgt:Wie erstellt man HashMap mit Streams, die Duplikate überschreiben?

Map<Integer, String> map = dao.findAll().stream() 
    .collect(Collectors.toMap(Entity::getType, Entity::getValue)); 

Nun, wenn ein Element der Sammlung hinzugefügt wird, wo der Schlüssel bereits vorhanden ist, ich das vorhandene Element in der Liste nur behalten wollen und überspringen

das zusätzliche Element. Wie kann ich das erreichen? Wahrscheinlich muss ich BinaryOperation<U> von toMap() verwenden, aber könnte jemand

ein Beispiel für meinen speziellen Fall zur Verfügung stellen?

+1

Haben Sie sich die Dokumentation angesehen? Weil sie ein Beispiel bieten: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function. Funktion-java.util.function.BinaryOperator- –

Antwort

9

Ja, Sie brauchen das BinaryOperation<U> und verwenden Sie es als drittes Argument für Collectors.toMap().

Im Falle eines Konflikts (Erscheinen eines bereits vorhandenen Schlüssels) können Sie zwischen dem Wert oldValue (dem vorhandenen) und newValue wählen. Im Codebeispiel nehmen wir immer den Wert oldValue. Aber Sie können mit diesen beiden Werten noch etwas anderes machen (nehmen Sie das größere, führen Sie die beiden zusammen).

Das folgende Beispiel zeigt eine mögliche Lösung, bei dem vorhandenen Wert immer in der Karte bleibt:

Map<Integer, String> map = dao.findAll().stream() 
    .collect(Collectors.toMap(Entity::getType, Entity::getValue, (oldValue, newValue) -> oldValue)); 

Siehe documentation für ein anderes Beispiel.