2015-08-31 4 views
109
Map<String, String> phoneBook=people.stream() 
            .collect(toMap(Person::getName, Person::getAddress)); 

Ich erhalte eine doppelte Schlüsselausnahme, wenn Duplikate auftreten.Ignoriere Duplikate beim Erstellen von Karten mit Streams

Ist es möglich zu ignorieren, um die Werte zu addieren, wenn die Duplikate auftreten?

Wenn es doppelt vorhanden ist, sollte einfach fortfahren, diesen doppelten Schlüssel zu ignorieren.

+5

liefern Just a [Merge-Funktion] (https://docs.oracle.com/javase/8/docs/api/java/util/ stream/Collectors.html # toMap-java.util.function.Function-java.util.function.Function-java.util.function.BinaryOperator-), das '(alt, neu) -> alt 'sagt. –

+0

Wenn Sie es verwenden können, wird HashSet den Schlüssel ignorieren, wenn es bereits vorhanden ist. – sahitya

+0

@ Kapitän-Aryabhatta. Ist es möglich, Schlüsselwerte in hashset – Patan

Antwort

204

Dies ist möglich, unter Verwendung der Parameter von mergeFunctionCollectors.toMap(keyMapper, valueMapper, mergeFunction):

Map<String, String> phoneBook = 
    people.stream() 
      .collect(Collectors.toMap(
      Person::getName, 
      Person::getAddress, 
      (address1, address2) -> { 
       System.out.println("duplicate key found!"); 
       return address1; 
      } 
     )); 

mergeFunction ist eine Funktion, die mit dem gleichen Schlüssel auf zwei Werten arbeitet. adress1 entspricht der ersten Adresse, die beim Sammeln von Elementen angetroffen wurde, und adress2 entspricht der zweiten gefundenen Adresse: Dieses Lambda sagt nur, dass die erste Adresse beibehalten werden soll und ignoriert die zweite.

+0

Vielen Dank. Könnten Sie mir helfen, wenn es möglich ist, Informationen zu protokollieren, wenn ein Duplikatschlüssel auftritt? – Patan

+2

@Patan Ich habe meinen Beitrag bearbeitet, um eine Druckanweisung hinzuzufügen, wenn ein Duplikat gefunden wird – Tunaki

+1

Ich bin verwirrt, warum ist Duplikat ** Werte ** (nicht Schlüssel) nicht erlaubt? Und wie man doppelte Werte erlaubt? –

43

Wie gesagt in JavaDocs:

Wenn die zugeordneten Schlüssel enthält Duplikaten (nach Object.equals(Object)), ein IllegalStateException ausgelöst wird, wenn die Sammelvorgang durchgeführt wird. Wenn die zugeordneten Schlüssel Duplikate enthalten, verwenden Sie stattdessen toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction).

So sollten Sie toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) stattdessen verwenden. Stellen Sie einfach eine Merge-Funktion zur Verfügung, die bestimmt, welche der Duplikate benötigt wird, um eine Karte zu erstellen. Zum Beispiel, wenn Sie die man sich nicht, rufen Sie einfach

Map<String, String> phoneBook = people.stream() 
    .collect(Collectors.toMap(Person::getName, Person::getAddress, (p1, p2) -> p1)); 
+0

Scheint wie „toMap“ nicht erkannt wird ... – bashan

+1

Verwenden 'Collectors.toMap' oder machen ein statischer Import – alaster

Verwandte Themen