2016-03-31 23 views
-3

ich wie eine Karte konvertieren möchte:Merge alle Listenwerte zusammen in einer Karte

Map<String, List<String>> 

zu

List<String> 

wo der Ergebnisliste die Zusammenführung aller Listenwerte.

+2

Beantworter, stellen Sie bitte keine fertigen Lösungen für solche Fragen zur Verfügung. Wir wollen sie hier nicht ermutigen. Lassen Sie uns OP helfen, indem Sie ihn zuerst selbst versuchen lassen. – Maroun

+0

ist keine fertige Lösung, was bedeutet das? – ypriverol

+1

Siehe http://stackoverflow.com/questions/29826417/how-to-retainall-of-list-of-lists-using-stream-reduce/29826611 –

Antwort

4

können Sie haben gerade

List<String> result = map.values().stream().flatMap(List::stream).collect(Collectors.toList()); 

Dies ruft die Werte der Karte mit values() dann flach Karten jede Liste in einen Strom, der durch seine Elemente und sammelt das Ergebnis in einer Liste.

Eine weitere Alternative, ohne flaches Abbilden jeder Liste, und damit leistungsfähiger sein kann, ist direkt an den Stream<List<String>> (durch values().stream() zurückgegeben) zu sammeln durch addAll auf jedem akkumulierte Ergebnis ruft.

List<String> result = map.values().stream().collect(ArrayList::new, List::addAll, List::addAll); 
1

Verwenden flatMap auf der Stream von Karteneinträge:

List<String> list = map.entrySet() 
         .stream() 
         .flatMap(e->e.getValue().stream()) 
         .collect(Collectors.toList()); 
+0

Eran: Auf eine andere Anmerkung, führt obige Aussage in die Erstellung von mehr temporäre Objekte mit jeder Operation (FlatMap und sammeln)? –

+0

@Ravindrababu Mehr temporäre Objekte im Vergleich zu was? – Eran

+0

Ich meine, wie Scala, map.flatMap() Rückgabe unveränderliche Sammlung und dann sammeln() Rückgabe neuer Satz von unveränderlichen Sammlung –

Verwandte Themen