মডিউল পাঠ (2/2)
স্ট্রিম API
জাভাতে স্ট্রিম এপিআই আপনাকে কার্যকরী প্রোগ্রামিং ব্যবহার করে ঘোষণামূলক উপায়ে বস্তুর সংগ্রহ প্রক্রিয়া করতে দেয়। একটি স্ট্রীম ডেটা সঞ্চয় করে না, তবে এর পরিবর্তে অপারেশনগুলির একটি পাইপলাইনের মাধ্যমে একটি উত্স (যেমন একটি তালিকা বা অ্যারে) থেকে উপাদানগুলি বহন করে।
একটি স্ট্রিম পাইপলাইন তিনটি অংশ নিয়ে গঠিত:
- একটি উৎস (যেমন,
list.stream()) - শূন্য বা তার বেশি ইন্টারমিডিয়েট অপারেশন (যা একটি নতুন স্ট্রিম ফেরত দেয়, যেমন,
filter,map) - একটি টার্মিনাল অপারেশন (যা একটি চূড়ান্ত ফলাফল বা পার্শ্ব-প্রতিক্রিয়া তৈরি করে এবং স্ট্রীম বন্ধ করে, যেমন,
collect,forEach,reduce)
কমন ইন্টারমিডিয়েট অপারেশন
মধ্যবর্তী ক্রিয়াকলাপগুলি অলস: একটি টার্মিনাল অপারেশন চালু না হওয়া পর্যন্ত এগুলি কার্যকর করা হয় না।
filter(Predicate): বুলিয়ান অবস্থার উপর ভিত্তি করে উপাদান ফিল্টার করে।map(Function): একটি ফাংশন প্রয়োগ করে প্রতিটি উপাদানকে অন্য বস্তুতে রূপান্তরিত করে।sorted(): স্ট্রীমের উপাদানগুলিকে সাজায়৷
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"সাধারণ টার্মিনাল অপারেশন
forEach(Consumer): স্ট্রীমের প্রতিটি উপাদানের জন্য একটি ক্রিয়া সম্পাদন করে।collect(Collector): স্ট্রীমের ফলাফলগুলিকে একটি পাত্রে (যেমন,Collectors.toList()ব্যবহার করে একটি তালিকা) সংগ্রহ করে।reduce(identity, BinaryOperator): স্ট্রিম উপাদানগুলিকে একটি একক ক্রমবর্ধমান মানের সাথে একত্রিত করে৷
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10নিজে চেষ্টা করে দেখুন
শুধুমাত্র জোড় সংখ্যা ফিল্টার করতে সংখ্যার স্ট্রীম ব্যবহার করে কোডটি সম্পূর্ণ করুন, ইভেন নামে একটি নতুন তালিকায় তাদের সংগ্রহ করুন এবং System.out.println ব্যবহার করে এটি মুদ্রণ করুন।
ইঙ্গিত দেখান
`numbers.stream()` কল করে শুরু করুন, `.filter(n -> n % 2 == 0)` যোগ করুন, এবং অবশেষে `.collect(Collectors.toList())` দিয়ে সংগ্রহ করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ম্যাপ ব্যবহার করে নামের তালিকার মধ্যে থাকা সমস্ত নামকে বড় হাতের অক্ষরে রূপান্তর করতে স্ট্রীম ব্যবহার করুন এবং একটি পদ্ধতির রেফারেন্স সহ forEach ব্যবহার করে একের পর এক মুদ্রণ করুন।
ইঙ্গিত দেখান
টার্মিনাল অপারেশনের পরে `.map(s -> s.toUpperCase())` ব্যবহার করুন `.forEach(System.out::println)`।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
একটি স্ট্রীম ব্যবহার করে সংখ্যা তালিকার সমস্ত সংখ্যার যোগফল গণনা করে কোডটি সম্পূর্ণ করুন এবং 0 এর প্রাথমিক মান সহ টার্মিনাল অপারেশন হ্রাস করুন। যোগফল মুদ্রণ করুন।
ইঙ্গিত দেখান
`numbers.stream().reduce(0, (a, b) -> a + b)` ব্যবহার করুন এবং ফলস্বরূপ ভেরিয়েবল প্রিন্ট করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ