Java 8: Listen mit Stream-API zusammenführen


80

Ich habe die folgende Situation

Map<Key, ListContainer> map; 

public class ListContainer{
  List<AClass> lst;
}

Ich muss alle Listen lstaus den ListContainerObjekten einer MapKarte zusammenführen.

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

Irgendeine Idee, wie man die Java 8-Stream-API verwendet?


Können Sie ein Beispiel geben, was Sie unter Zusammenführen verstehen? Angenommen, Ihre Karte lautet {a: [1,2], b[3,4]}: Möchten Sie sie verketten [1,2,3,4], eine Liste mit Listen [[1,2],[3,4]]erstellen oder sie komprimieren [[1,3],[2,4]]? Sie wissen auch, dass eine Karte keine Reihenfolge hat, oder?
tobias_k

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

Wenn ListContainernur ein hüllt , List<T>dann können Sie ersetzen Map<Key, ListContainer>mitMap<Key, List<T>>
ThePyroEagle

Antworten:


166

Ich denke, das flatMap()ist was du suchst.

Zum Beispiel:

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

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

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

3
@TWiStErRob Ja, das habe ich in meinem ursprünglichen Kommentar geschrieben. Warum wurde es gelöscht?
Puce

@Puce eine Notiz in Ihrer Antwort, die erklärt, warum dies .flatMap(Collection::stream)nicht möglich ist, wäre besser, denke ich. Sollte dauerhafter sein.
SQB

1
@ Alex ja, das ist ein Weg resp. .map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
Puce

54

Alternative: Stream.concat ()

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

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

2

In Java 8 können wir stream List1.stream () verwenden. Collect (Collectors.toList ()). AddAll (List2); Eine weitere Option List1.addAll (List2)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.