2014-04-16 6 views
28

Ich habe die folgende SituationJava 8: fusionieren Listen mit Stream API

Map<Key, ListContainer> map; 

public class ListContainer{ 
    List<AClass> lst; 
} 

ich alle Listen lst aus den ListContainer Objekte aus einer Map Karte zu fusionieren haben.

public static void main(String args[]){ 
    List<AClass> alltheObjectsAClass = map.values().stream(). // continue....  
} 

Jede Idee, wie Java 8 Stream API?

+0

Können Sie ein Beispiel geben, was Sie mit verschmelzenden bedeuten? Sagen Sie, Ihre Map ist '{a: [1,2], b [3,4]}', wollen Sie sie verketten, wie '[1,2,3,4]', oder eine Liste von Listen erstellen, '[[1,2], [3,4]]', oder zip sie '[[1,3], [2,4]]'? Sie wissen auch, dass eine Karte keine Bestellung hat, oder? –

+0

@tobias_k Ich möchte, dass das Ergebnis '[1,2,3,4]' ist, unsortiert! –

+0

Wenn 'ListContainer' nur eine' List 'umschließt, dann können Sie' Map 'durch' Map > ' – ThePyroEagle

Antwort

82

Ich denke, flatMap() ist was du suchst.

Zum Beispiel:

List<AClass> allTheObjects = map.values() 
     .stream() 
     .flatMap(listContainer -> listContainer.lst.stream()) 
     .collect(Collectors.toList()); 
+17

ersetzen. Beachten Sie, dass flatmap einfach' .flatMap (Collection :: stream) ' – Jean

+1

? Warum wurden die Kommentare gelöscht, die erklärten warum '.flatMap (Collection :: stream)' hier nicht möglich ist? – Puce

+0

@Puce gute Frage, aber es ist irgendwie möglich: Wenn 'ListContainer' gekapselt ist (dh hat einen Getter für' lst'), können Sie '.flatMap (->)' in '.map (ListContainer :: getLst) '' .flatMap (Collection :: stream) ' – TWiStErRob

22

Alternative: Stream.concat()

Stream.concat(map.values().stream(), listContainer.lst.stream()) 
          .collect(Collectors.toList() 
+0

plus 1, obwohl es die Frage nicht beantwortet, es beantwortet den Titel der Frage –

+0

Genau das, was ich gesucht habe! Vielen Dank! – Hans