Wenn Sie komplexere Szenario haben oder nicht mag aus irgendeinem Grund @Aaron zu beantworten, können Sie die flatMap-Capturing Trick pro jedem äußeren Element einelementige Strom erzeugt tun:
as.stream().
flatMap(a -> Stream.of(a.getX()).
filter(x -> x != null).
map(x -> a)).
forEach(System.out::println);
Hier haben wir Verschachtelter Stream pro Element, in dem Sie statusfreie Stream-Operationen ausführen können (map
, filter
, peek
und flatMap
), die einen Verweis auf das ursprüngliche Element haben. Nachdem das ursprüngliche Element nicht mehr benötigt wird, schließen Sie die flatMap
und fahren mit dem ursprünglichen Stream fort. Beispiel:
Stream.of("a", "bb", "ccc", "dd", "eeee")
.flatMap(a -> Stream.of(a.length())
.filter(x -> x > 2)
.map(x -> a))
.forEach(System.out::println);
// prints "ccc" and "eeee".
Oder zwei Filter:
Stream.of("a", "bb", "ccc", "dd", "eeee")
.flatMap(a -> Stream.of(a.length())
.filter(x -> x > 2)
.map(x -> a.charAt(0)) // forget the length, now check the first symbol
.filter(ch -> ch == 'c')
.map(x -> a)) // forget the first symbol, reverting to the whole string
.forEach(System.out::println);
// prints only "ccc"
Natürlich ist eine solche einfache Szenarien neu geschrieben werden könnte wie @Aaron vermuten lässt, aber in komplexeren Fällen flatMap-Capturing geeignete Lösung sein kann.
Wenn das Nachschlagen an 'x' gebunden ist, würde ich eher vorschlagen, den Code zu ändern, um etwas wie 'a.lookup (lookup :: get)' zu erhalten. Dann hättest du ein einfaches forEach. – zeroflagL
'für (A a: as) if (a.getX()! = Null) a.setLookedUpVal (lookup.get (a.getX()));' oder, wenn 'getX()' teuer ist '' (A a: as) {Xx = a.getX(); if (x! = null) a.setLookedUpVal (lookup.get (x)); } '. Vergleichen Sie jede Stream-basierte Lösung mit * dem *, bevor Sie sich entscheiden, sie zu verwenden ... – Holger