wake-up-neo.com

Java 8 Stream-Gruppierungvon

Ich habe List<Map<String, String>> jedes Element in der Liste ist eine Karte, z

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

Ich möchte einen Map<String, List<String>> erstellen, in dem companyName einer Liste von firstName __ zugeordnet wird, z 

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

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

wie erstelle ich einen Map<String, List<String>>?

18
Omer

Ich habe es nicht getestet, aber so etwas sollte funktionieren:

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

Sie können das Formular verwenden: 

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

d. h. die Werte aus der Karte in der Abwärtsrichtung angeben, um als Liste aufgenommen zu werden. Die Dokumentation hat dafür ein gutes Beispiel ( hier ).

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

5
nitishagar

Die groupingBy-Methode liefert eine Karte, deren Werte Listen sind. Wenn Sie diese Listen auf irgendeine Weise bearbeiten möchten, geben Sie einen "Downstream-Collector" an In Ihrem Fall möchten Sie keine Liste als Wert verwenden. Daher müssen Sie einen Downstream-Collector angeben. 

Um die Map zu bearbeiten, können Sie die statische Methodenzuordnung in der Collectors-Datei verwenden:

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

Im Wesentlichen wird ein Collector generiert, indem eine Funktion auf die nachgeordneten Ergebnisse angewendet wird, und die Funktion wird an einen anderen Collector übergeben. 

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

Dadurch wird ein Downstream-Collector zurückgegeben, der das erreicht, was Sie möchten.

0
Davidw