2015-01-15 14 views
18

ho List<Map<String, String>> ogni elemento della lista è una mappa ad esempioJava 8 Streaming groupingby

companyName - IBM 
firstName - James 
country - USA 
... 

Vorrei creare un Map<String, List<String>> dove le mappe companyName a una lista di dei firstName esempio

IBM -> James, Mark 
ATT -> Henry, Robert.. 


private Map<String,List<String>> groupByCompanyName(List<Map<String, String>> list) { 
    return list.stream().collect(Collectors.groupingBy(item->item.get("companyName"))); 
} 

ma ciò creerà Map<String, List<Map<String, String>> (mappando comanyName in un elenco di mappe)

come creare un Map<String, List<String>>?

risposta

29

non ho ancora testato, ma qualcosa di simile dovrebbe funzionare:

Map<String, List<String>> namesByCompany 
    = list.stream() 
      .collect(Collectors.groupingBy(item->item.get("companyName"), 
        Collectors.mapping(item->item.get("firstName"), Collectors.toList()))); 
+0

C'è un modo per ottenere 'String []' invece di 'Lista ' –

+1

Io non la penso così (almeno non direttamente), poiché non esiste il metodo 'Collectors.toArray'. @VinitSolanki – Eran

5

È possibile utilizzare il modulo:

groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream) 

ossia specificare i valori dalla mappa nella valle per essere preso come lista. La documentazione ha un buon esempio per questo (here).

downstream essere qualcosa di simile - mapping(item->item.get(<name>), toList())

0

Il metodo groupingBy produce una mappa i cui valori sono le liste. Se si desidera elaborare tali elenchi in qualche modo, fornire un "collettore downstream" In questo caso, non si desidera un elenco come valore, quindi è necessario fornire un collector downstream.

per manipolare la mappa, è possibile utilizzare la mappatura metodo statico nel file di Collezionisti:

Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper, 
          Collector<? super U, A, R> downstream) 

genera fondamentalmente un collettore applicando una funzione per i risultati a valle e passa la funzione da un altro collezionista.

Collectors.mapping(item->item.get("firstName"), Collectors.toList()) 

Ciò restituirà un collettore a valle che realizzerà ciò che si desidera.