2017-03-16 2 views
4

Vielleicht ist es Perversion, aber ich möchte Ergebnisse des inneren Streams zusammenfließen, um auf der Ebene darüber zu streamen.Java 8 Streams verschmelzen inner Stream-Ergebnis zu Stream über

Zum Beispiel haben wir einige komplexe Karte mit Daten:

Map<String, List<Map<String, Object>>> dataMap 

und ich brauche alle Objekte zu sammeln, um Liste. Für jetzt mache ich so:

Set<Object> segmentIds = new HashSet<>(); 
dataMap.values().forEach(maps -> maps.forEach(map -> segmentIds.add(map.get("object")))); 

Aber es ist nicht hübsch Weg. Aber ich kann nicht verstehen, wie man Daten vom inneren Zyklus zum äußeren überträgt, um sie am Ende zu sammeln.

Ist es möglich, ohne äußere Objekte zu tun?

+2

Ich bin nicht ganz sicher über Ihre Eingabe und Ausgabe erforderlich. Kannst du ein [MCVE] zur Verfügung stellen? – Thomas

Antwort

6

Was ist damit:

Set<Object> collect = dataMap.values() 
      .stream() 
      .flatMap(Collection::stream) 
      .map(map -> map.get("object")) 
      .collect(Collectors.toSet()); 
+0

Danke! Es ist genau das, was ich brauchte. – SoulCub

1

Sie müssen flatMap der Stream-API verwenden.

List<Object> allObjects = dataMap.values().stream() 
    .flatMap(l -> l.stream()) 
    .flatMap(m -> m.values().stream()) 
    .collect(Collectors.toList()) 

-Code wird nicht

getestet