মানচিত্র () এবং ফ্ল্যাটম্যাপ ()
map()
কেবলমাত্র একটি ফাংশন নেয় একটি ল্যাম্বডা পরম যেখানে টি উপাদান থাকে আর আর টি ব্যবহার করে রিটার্ন উপাদান তৈরি হয় the
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>
যেখানে
টি এমন একটি ধরন যা থেকে / দিয়ে স্ট্রিম তৈরি করা যায় । এটি একটি তালিকা (টি.স্ট্রিম ()), একটি অ্যারে (অ্যারেস স্ট্রিম (কিছু অ্যারে)) ইত্যাদি হতে পারে anything প্রতিটি দেবের নীচের উদাহরণে অনেকগুলি ভাষা রয়েছে, তাই দেব। ভাষাগুলি একটি তালিকা এবং ল্যাম্বডা প্যারামিটার ব্যবহার করবে।
আর টি ফলাফল ব্যবহার করে নির্মিত হবে যা টি ব্যবহার করে তৈরি করা হবে we আমাদের টি এর অনেকগুলি দৃষ্টান্ত রয়েছে তা জেনেও আমাদের কাছে প্রাকৃতিকভাবে আর থেকে প্রচুর স্ট্রিম হবে Type টাইপ আর এর এই সমস্ত স্ট্রিমগুলি এখন টাইপ আর থেকে একটি একক 'ফ্ল্যাট' স্ট্রিমের সাথে মিলিত হবে Type ।
উদাহরণ
বাচ্চিরি তৌফিকের উদাহরণগুলি এখানে এর উত্তর দেখতে সহজ এবং বোঝা সহজ। কেবল স্পষ্টতার জন্য, কেবল আমাদের বলুন যে আমাদের বিকাশকারীদের একটি দল রয়েছে:
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 এ স্ট্রিম.ম্যাপ () প্রয়োগ করা :
dev_team.map(dev -> dev.getLanguages())
আপনাকে এই কাঠামো দেবে:
{
{lang_a,lang_b,lang_c},
{lang_d},
{lang_e,lang_f}
}
যা মূলত ক List<List<Languages>> /Object[Languages[]]
। খুব সুন্দর না, জাভা 8 -র মতো !!
সঙ্গে 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
।