map () ve flatMap ()
map()
Sadece bir Fonksiyonu alır, burada T elemanıdır ve R, T kullanılarak inşa edilen dönüş elemanıdır. Sonunda, R Tipi nesnelerle bir Akışımız olacaktır. Basit bir örnek şöyle olabilir:
Stream
.of(1,2,3,4,5)
.map(myInt -> "preFix_"+myInt)
.forEach(System.out::println);
Sadece Tip 1 ila 5 elemanlarını alır Integer
, her öğeyi String
değer içeren türden yeni bir öğe oluşturmak için kullanır "prefix_"+integer_value
ve yazdırır.
flatMap()
FlatMap () işlevinin aşağıdaki F<T, R>
durumlarda bir işlev aldığını bilmek yararlıdır:
T, bir Stream'in içinden / ile oluşturulabildiği bir tiptir . Bu bir List (T.stream ()), bir dizi (Arrays.stream (someArray)), vb. Olabilir. aşağıdaki örnekte her geliştiricinin birçok dili vardır, bu yüzden dev. Diller bir Listedir ve lambda parametresini kullanır.
R, T kullanılarak oluşturulacak olan Akımdır. Birçok T örneğine sahip olduğumuzu bilerek, doğal olarak R'den çok sayıda Akışımız olacaktır. R Tipi'nden tüm bu Akışlar artık tek birleştirilebilir tek bir 'düz' Type R dan Akış .
Misal
Bachiri Taoufiq örnekleri buradaki cevabının örnekleri basit ve anlaşılması kolaydır. Sadece netlik için, geliştiricilerden oluşan bir ekibimiz olduğunu varsayalım:
dev_team = {dev_1,dev_2,dev_3}
, her geliştiricinin birçok dil bilmesi ile:
dev_1 = {lang_a,lang_b,lang_c},
dev_2 = {lang_d},
dev_2 = {lang_e,lang_f}
Başvuru Stream.map () dev_team her dev dillerini almak için:
dev_team.map(dev -> dev.getLanguages())
size bu yapıyı verecektir:
{
{lang_a,lang_b,lang_c},
{lang_d},
{lang_e,lang_f}
}
temelde bir List<List<Languages>> /Object[Languages[]]
. Çok hoş değil, ne de Java8 gibi !!
ile Stream.flatMap()
yukarıdaki yapıyı alır olarak sizin şeyler 'düzleştirmek' olabilir
ve haline döner{lang_a, lang_b, lang_c, lang_d, lang_e, lang_f}
temelde olarak kullanılan olabilir, List<Languages>/Language[]/etc
...
böylece sonunda, kodunuz daha anlamlı olur:
dev_team
.stream() /* {dev_1,dev_2,dev_3} */
.map(dev -> dev.getLanguages()) /* {{lang_a,...,lang_c},{lang_d}{lang_e,lang_f}}} */
.flatMap(languages -> languages.stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
.doWhateverWithYourNewStreamHere();
ya da sadece:
dev_team
.stream() /* {dev_1,dev_2,dev_3} */
.flatMap(dev -> dev.getLanguages().stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
.doWhateverWithYourNewStreamHere();
Map () ve flatMap () ne zaman kullanılır? :
Kullanım map()
için akımından T türü her elemanı bir dönüştürülmüş / eşlenmesi için beklenen tek tip R. elemanının sonuç türü bir eşleme (1 eleman başlangıç -> 1 bitiş öğesi) ve R tipi elemanlarının yeni akım Iade edildi.
Kullanım flatMap()
akışınızdan tipi T her öğe eşlenen / a dönüştürülmesi gerektiği zaman Koleksiyonları türünün tür R. sonucu elemanlarının bir haritalama (1 başlangıç elemanı -> n uç elemanları) . Bu Koleksiyonlar daha sonra R tipi yeni bir eleman akışıyla birleştirilir (veya düzleştirilir ). Bu, örneğin iç içe halkaları temsil etmek için yararlıdır .
Java 8 Öncesi:
List<Foo> myFoos = new ArrayList<Foo>();
for(Foo foo: myFoos){
for(Bar bar: foo.getMyBars()){
System.out.println(bar.getMyName());
}
}
Java 8 yayınla
myFoos
.stream()
.flatMap(foo -> foo.getMyBars().stream())
.forEach(bar -> System.out.println(bar.getMyName()));
map :: Stream T -> (T -> R) -> Stream R
,flatMap :: Stream T -> (T -> Stream R) -> Stream R
.