2015-03-12 10 views
5

Ich habe eine Liste von Objekten wie folgt aus:Java 8 Zuordnung von Listen Stream

[ 
    {value: 1, tag: a}, 
    {value: 2, tag: a}, 
    {value: 3, tag: b}, 
    {value: 4, tag: b}, 
    {value: 5, tag: c}, 
] 

wo jedes Objekt der es sich um eine Instanz einer Klasse ist Entry, die tag und value als Eigenschaften aufweist. Ich möchte, dass sie auf diese Weise zur Gruppe:

{ 
    a: [1, 2], 
    b: [3, 4], 
    c: [5], 
} 

Das ist, was ich bisher getan habe:

List<Entry> entries = <read from a file> 

Map<String, List<Entry>> map = entries.stream() 
    .collect(Collectors.groupingBy(Entry::getTag, LinkedHashMap::new, toList())); 

Und das ist mein Ergebnis (nicht das, was ich wollte):

{ 
    a: [{value: 1, tag: a}, {value: 2, tag: a}], 
    b: [{value: 3, tag: b}, {value: 4, tag: b}], 
    c: [{value: 5, tag: c}], 
} 

Mit anderen Worten, ich möchte eine Liste von Zeichenfolgen als Werte meiner neuen Zuordnung (Map<String, List<String>>), und nicht eine Liste von Objekten (Map<String, List<Entry>>). Wie kann ich dies mit Java 8 neuen coolen Funktionen erreichen?

Antwort

9

Verwendung mapping:

Map<String, List<String>> map = 
    entries.stream() 
     .collect(Collectors.groupingBy(Entry::getTag, 
             Collectors.mapping(Entry::getValue, toList()))); 
+0

danke :) es funktionierte – Oneiros