2015-07-26 11 views
6

Problemi con l'API Stream per ottenere un mapping uno a uno. Fondamentalmente, dì che hai una lezione.Mappa one-to-one con flussi Java

public class Item { 
    private final String uuid; 

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

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

Mi piacerebbe un Map<String, Item> per una facile ricerca. Ma dato un Stream<Item> non sembra un modo semplice per arrivare a quello Map<String, Item>.

Ovviamente, Map<String, List<Item>> non è nessuna cosa:

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

Questo è il caso più generale più sicuri, ma abbiamo fare sanno in questa situazione che ci sarà sempre solo uno-a-uno. Non riesco a trovare nulla che compili anche se - Ho specificamente cercato di eliminare il parametro downstream a Collectors.groupingBy. Qualcosa di simile:

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

Cosa mi manca?

risposta

8

Utilizza la Collectors#toMap(Function, Function), generazione della chiave da ogni s uuidItem' e la Item come il valore stesso.

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

Nota del javadoc

Se i tasti mappati contiene duplicati (secondo Object.equals(Object)), un IllegalStateException viene generata quando viene eseguita l'operazione raccolta. Se le chiavi mappate possono avere duplicati , utilizzare invece toMap(Function, Function, BinaryOperator).

+1

E 'la pena di aggiungere che un'eccezione verrà generata se si verifica chiave ripetere. –

1

groupingBy() raccoglie articoli (al plurale, come List) da una chiave.

Volete toMap():

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

magari provare

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