daha karmaşık senaryo var ya nedense cevap @Aaron beğenmezseniz, her dış öğe başına tek eleman akışı oluşturarak flatMap-yakalama hile yapabilirsiniz: Elimizdeki İşte
as.stream().
flatMap(a -> Stream.of(a.getX()).
filter(x -> x != null).
map(x -> a)).
forEach(System.out::println);
Orijinal öğeye başvuruda bulunarak, herhangi bir durum bilgisi olmayan akış işlemlerini (map
, filter
,ve flatMap
) yapabileceğiniz her öğe için iç içe akış. Orijinal eleman gereksiz hale geldikten sonra, flatMap
'u kapatır ve orijinal akışa devam edersiniz. Örnek:
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".
Ya da iki filtreler:
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"
@Aaron anlaşılacağı gibi böyle basit senaryolar yeniden yazılabilir Tabii
ancak daha karmaşık durumlarda flatMap-yakalama uygun çözüm olabilir.
Arama, x'e bağlıysa, kodunuzu değiştirmeyi önerebilirim; örneğin, bir .lookup (lookup :: get) 'gibi bir şey elde etmek için. O zaman basit bir 'forEach' olurdu. – zeroflagL
'(a a: as) için (a.getX()! = Null) a.setLookedUpVal (lookup.get (a.getX()));' veya getX() 'pahalıysa,' için (A a: as) {X x = a.getX(); eğer (x! = boş) a.setLookedUpVal (lookup.get (x)); } '. Kullanmaya karar vermeden önce her Stream tabanlı çözümü * bu * ile karşılaştırın * – Holger