2015-01-15 12 views
18

Ich habe List<Map<String, String>> jedes Element in der Liste ist eine Karte zBJava 8 Stream-groupingby

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

ich ein Map<String, List<String>> schaffen möchte, wo es company auf eine Liste von dem Vornamen zB

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"))); 
} 
Karten

, aber dies erstellt Map<String, List<Map<String, String>> (Mapping comanyName zu einer Liste von Karten)

wie Sie eineerstellen?

Antwort

29

habe es nicht getestet, aber so etwas wie dies funktionieren sollte:

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

Gibt es eine Möglichkeit, 'String []' anstelle von 'List ' –

+1

Ich glaube nicht (zumindest nicht direkt), da es keine 'Collectors.toArray' Methode gibt. @VinitSolanki – Eran

5

können Sie das Formular verwenden:

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

das heißt die Werte aus der Karte in den nachgeschalteten angeben als Liste genommen werden. Die Dokumentation hat ein gutes Beispiel dafür (here).

downstream ist so etwas wie - mapping(item->item.get(<name>), toList())

0

Die groupingBy Methode ergibt sich eine Karte, deren Werte Listen. Wenn Sie diese Listen in irgendeiner Weise bearbeiten möchten, geben Sie einen "Downstream-Collector" an. In Ihrem Fall möchten Sie keine Liste als Wert, daher müssen Sie einen nachgeordneten Collector bereitstellen.

um die Karte zu manipulieren, können Sie die statische Methode Mapping in Collectors Datei:

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

Es erzeugt im Wesentlichen einen Kollektor durch eine Funktion an die nachfolgenden Ergebnisse der Anwendung und übergibt die Funktion zu einem anderen Sammler.

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

Dies wird einen nachgeschalteten Kollektor zurückgeben, der das erreicht, was Sie wollen.