2015-07-26 1 views
6

Sie haben ein wenig Probleme mit der Stream-API, um eine Eins-zu-eins-Zuordnung zu erhalten. Im Grunde sagen Sie, dass Sie eine Klasse haben.Eins-zu-eins-Karte mit Java-Streams

public class Item { 
    private final String uuid; 

    private Item(String uuid) { 
     this.uuid = uuid; 
    } 

    /** 
    * @return universally unique identifier 
    */ 
    public String getUuid() { 
     return uuid; 
    } 
} 

Ich möchte eine Map<String, Item> für einfache Suche. Aber angesichts einer Stream<Item> scheint es nicht eine einfache Möglichkeit, um diese Map<String, Item> zu erreichen.

Offensichtlich ist Map<String, List<Item>> kein Ding:

public static Map<String, List<Item>> streamToOneToMany(Stream<Item> itemStream) { 
    return itemStream.collect(groupingBy(Item::getUuid)); 
} 

der sichere Nutzung der allgemeineren Fall ist, aber wir in dieser Situation wissen tun, dass es immer nur eine Eins-zu-eins sein. Ich kann jedoch nichts finden, was kompiliert - ich habe speziell versucht, mit dem downstream Parameter zu Collectors.groupingBy zu misten. Etwas wie:

// DOESN'T COMPILE 
public static Map<String, Item> streamToOneToOne(Stream<Item> itemStream) { 
    return itemStream.collect(groupingBy(Item::getUuid, Function.identity())); 
} 

Was vermisse ich?

Antwort

8

Verwenden der Collectors#toMap(Function, Function), Erzeugen des Schlüssels aus jedem Item ‚s uuid und die Item als der Wert selbst.

public static Map<String, Item> streamToOneToOne(Stream<Item> itemStream) { 
    return itemStream.collect(Collectors.toMap(Item::getUuid, Function.identity())); 
} 

Hinweis vom Javadoc-

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, Function, BinaryOperator).

+1

Es lohnt fügte hinzu, dass eine Ausnahme ausgelöst wird, wenn sich wiederholende Schlüssel erfolgt. –

1

groupingBy() sammelt Elemente (Plural, als List) durch einen Schlüssel.

Sie wollen toMap():

public static Map<String, Item> streamToOneToOne(Stream<Item> itemStream) { 
    return itemStream.collect(toMap(Item::getUuid, Function.identity())); 
} 
-1

Vielleicht

versuchen
itemStream.stream().collect(toMap(Item::getUuid,Functions.identity());