नक्शा () और फ्लैट मैप ()
map()
बस एक फंक्शन लेता है एक लैम्ब्डा परम जहां टी तत्व है और आर टी का उपयोग करके बनाया गया वापसी तत्व है। अंत में हमारे पास टाइप आर की वस्तुओं के साथ एक स्ट्रीम होगा। एक सरल उदाहरण हो सकता है:
Stream
.of(1,2,3,4,5)
.map(myInt -> "preFix_"+myInt)
.forEach(System.out::println);
यह केवल प्रकार 1 से 5 के तत्वों को लेता है Integer
, प्रत्येक तत्व का उपयोग प्रकार String
के मूल्य से एक नया तत्व बनाने के लिए करता है "prefix_"+integer_value
और इसे प्रिंट करता है।
flatMap()
यह जानना उपयोगी है कि फ्लैटपाइप () एक फ़ंक्शन F<T, R>
कहाँ ले जाता है
टी एक प्रकार है जिसमें से / के साथ एक स्ट्रीम बनाया जा सकता है । यह एक सूची (T.stream) (), एक सरणी (Arrays.stream (someArray)), आदि .. कुछ भी हो सकता है जिसमें से एक स्ट्रीम / या फ़ॉर्म के साथ हो सकता है। प्रत्येक देव के नीचे उदाहरण में कई भाषाएं हैं, इसलिए देव। भाषाएँ एक सूची है और एक लैम्बडा पैरामीटर का उपयोग करेगी।
R परिणामी स्ट्रीम है जिसे T के उपयोग से बनाया जाएगा। यह जानते हुए कि हमारे पास T के कई उदाहरण हैं, हम स्वाभाविक रूप से R से कई स्ट्रीम होंगे। टाइप R से इन सभी स्ट्रीम को अब टाइप R से एक सिंगल 'फ्लैट' स्ट्रीम में जोड़ा जाएगा। ।
उदाहरण
बाछिरी तौफीक के उदाहरण यहाँ इसका उत्तर सरल और समझने में आसान है। स्पष्टता के लिए, बस हम डेवलपर्स की एक टीम है:
dev_team = {dev_1,dev_2,dev_3}
कई भाषाओं को जानने वाले प्रत्येक डेवलपर के साथ:
dev_1 = {lang_a,lang_b,lang_c},
dev_2 = {lang_d},
dev_2 = {lang_e,lang_f}
प्रत्येक देव की भाषाएँ पाने के लिए dev_team पर Stream.map () लागू करना :
dev_team.map(dev -> dev.getLanguages())
आप इस संरचना दे देंगे:
{
{lang_a,lang_b,lang_c},
{lang_d},
{lang_e,lang_f}
}
जो मूल रूप से एक है List<List<Languages>> /Object[Languages[]]
। न तो बहुत सुंदर, न ही जावा-जैसा !!
इसके साथ Stream.flatMap()
आप चीजों को 'समतल' कर सकते हैं क्योंकि यह उपरोक्त संरचना को लेता है
और इसे बदल देता है {lang_a, lang_b, lang_c, lang_d, lang_e, lang_f}
, जिसे मूल रूप से उपयोग किया जा सकता है List<Languages>/Language[]/etc
...
इसलिए अंत में, आपका कोड इस तरह से अधिक समझ में आएगा:
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();
या केवल:
dev_team
.stream() /* {dev_1,dev_2,dev_3} */
.flatMap(dev -> dev.getLanguages().stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
.doWhateverWithYourNewStreamHere();
मानचित्र का उपयोग कब करें () और फ्लैटपाइप का उपयोग करें () :
का प्रयोग करें map()
जब अपनी स्ट्रीम से प्रकार टी के प्रत्येक तत्व मैप किया जा माना जाता है / एक में तब्दील हो एक प्रकार आर के तत्व परिणाम प्रकार की मैपिंग है (1 प्रारंभिक तत्व -> 1 अंत तत्व) और प्रकार आर के तत्वों की नई धारा वापस आ गया है।
का प्रयोग करें flatMap()
अपनी स्ट्रीम से प्रकार टी के प्रत्येक तत्व मैप किया गया / एक में तब्दील हो जाता है जब संग्रह एक प्रकार की मैपिंग के प्रकार आर परिणाम तत्वों की है (1 प्रारंभिक तत्व -> n अंत तत्व) । इन संग्रहों को फिर से टाइप आर के तत्वों की एक नई धारा में विलय (या चपटा ) किया जाता है। यह नेस्टेड लूप का प्रतिनिधित्व करने के लिए उदाहरण के लिए उपयोगी है ।
पूर्व जावा 8:
List<Foo> myFoos = new ArrayList<Foo>();
for(Foo foo: myFoos){
for(Bar bar: foo.getMyBars()){
System.out.println(bar.getMyName());
}
}
पोस्ट 8 जावा
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
।