Java 8 এর Stream API-তে Aggregation এবং Reduction হল দুটি গুরুত্বপূর্ণ কাজ যা Collectors এর মাধ্যমে সম্পন্ন করা হয়। এই দুটি প্রক্রিয়া স্ট্রিমের উপাদানগুলিকে একত্রিত (aggregate) বা সংকুচিত (reduce) করার জন্য ব্যবহৃত হয়।
Aggregation:
Aggregation এর মাধ্যমে, স্ট্রিমের উপাদানগুলোকে একত্রিত করা হয়। এটি সাধারণত collect মেথডের মাধ্যমে করা হয়, যা স্ট্রিমের উপাদানগুলোকে একটি নতুন সংগ্রহ (collection) যেমন List, Set, Map ইত্যাদিতে জমা করে।
Reduction:
Reduction এর মাধ্যমে, স্ট্রিমের উপাদানগুলোকে একটি একক মানে (যেমন যোগফল, গুনফল ইত্যাদি) সংকুচিত করা হয়। এটি সাধারণত reduce মেথড ব্যবহার করে করা হয়, যা স্ট্রিমের উপাদানগুলির উপর একটি বাইনারি অপারেশন প্রয়োগ করে।
১. Aggregation উদাহরণ
Aggregation হল উপাদানগুলোকে একত্রিত করার প্রক্রিয়া, যেমন List, Set বা String তৈরি করা।
উদাহরণ: toList() - List তৈরি করা
import java.util.List;
import java.util.stream.Collectors;
public class AggregationExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// স্ট্রিমের উপাদানগুলোকে একটি List-এ একত্রিত করা
List<Integer> collectedList = numbers.stream()
.collect(Collectors.toList());
System.out.println(collectedList); // Output: [1, 2, 3, 4, 5]
}
}এখানে, Collectors.toList() ব্যবহার করে স্ট্রিমের উপাদানগুলোকে একটি নতুন List-এ একত্রিত করা হয়েছে।
উদাহরণ: joining() - String তৈরি করা
import java.util.List;
import java.util.stream.Collectors;
public class AggregationExample {
public static void main(String[] args) {
List<String> words = List.of("Java", "is", "fun");
// সব শব্দকে একটি স্ট্রিং-এ যোগ করা
String result = words.stream()
.collect(Collectors.joining(" "));
System.out.println(result); // Output: Java is fun
}
}এখানে, Collectors.joining() ব্যবহার করে স্ট্রিমের সব উপাদানকে একটি একক String-এ একত্রিত করা হয়েছে, যেখানে প্রতিটি উপাদানের মধ্যে একটি স্পেস যুক্ত করা হয়েছে।
উদাহরণ: groupingBy() - গ্রুপিং করা
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class AggregationExample {
public static void main(String[] args) {
List<String> words = List.of("apple", "banana", "cherry", "apricot");
// প্রথম অক্ষরের উপর ভিত্তি করে গ্রুপিং করা
Map<Character, List<String>> groupedByFirstLetter = words.stream()
.collect(Collectors.groupingBy(word -> word.charAt(0)));
System.out.println(groupedByFirstLetter);
// Output: {a=[apple, apricot], b=[banana], c=[cherry]}
}
}এখানে, Collectors.groupingBy() ব্যবহার করে প্রথম অক্ষরের ভিত্তিতে গ্রুপিং করা হয়েছে।
২. Reduction উদাহরণ
Reduction হল স্ট্রিমের উপাদানগুলোর উপর একটি বাইনারি অপারেশন প্রয়োগ করে একটি একক মানে রূপান্তর করা। reduce() মেথডটি ব্যবহার করে সাধারণত এই কাজটি করা হয়।
উদাহরণ: reduce() - যোগফল বের করা
import java.util.List;
import java.util.Optional;
public class ReductionExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// স্ট্রিমের উপাদানগুলোর যোগফল বের করা (Reduction)
Optional<Integer> sum = numbers.stream()
.reduce((a, b) -> a + b);
sum.ifPresent(System.out::println); // Output: 15
}
}এখানে, reduce() মেথড ব্যবহার করে আমরা স্ট্রিমের সকল সংখ্যার যোগফল বের করেছি। reduce() একটি বাইনারি অপারেশন (এখানে a + b) প্রয়োগ করে একটি একক ফলাফল (যোগফল) বের করে।
উদাহরণ: summarizingInt() - পরিসংখ্যান তৈরি
import java.util.List;
import java.util.IntSummaryStatistics;
import java.util.stream.Collectors;
public class ReductionExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// সংখ্যাগুলির উপর সঙ্গতিপূর্ণ পরিসংখ্যান তৈরি
IntSummaryStatistics stats = numbers.stream()
.collect(Collectors.summarizingInt(Integer::intValue));
System.out.println("Sum: " + stats.getSum()); // Output: Sum: 15
System.out.println("Average: " + stats.getAverage()); // Output: Average: 3.0
System.out.println("Max: " + stats.getMax()); // Output: Max: 5
}
}এখানে, Collectors.summarizingInt() ব্যবহার করা হয়েছে যা স্ট্রিমের উপাদানগুলোর উপর পরিসংখ্যান তৈরি করে, যেমন যোগফল, গড়, সর্বোচ্চ মান ইত্যাদি।
উদাহরণ: count() - উপাদানের সংখ্যা
import java.util.List;
public class ReductionExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// স্ট্রিমের উপাদানগুলির সংখ্যা বের করা
long count = numbers.stream().count();
System.out.println("Count: " + count); // Output: 5
}
}এখানে, count() মেথড ব্যবহার করে স্ট্রিমের উপাদানগুলির সংখ্যা বের করা হয়েছে।
৩. Aggregation এবং Reduction এর পার্থক্য
| বৈশিষ্ট্য | Aggregation | Reduction |
|---|---|---|
| ধরন | একাধিক উপাদানকে একত্রিত করা (যেমন List, Set তৈরি করা) | একাধিক উপাদানকে একটি একক মানে সংকুচিত করা (যেমন যোগফল) |
| উদাহরণ | toList(), joining(), groupingBy() | reduce(), summarizingInt(), count() |
| ফলাফল | একটি সংগ্রহ তৈরি করা (List, Set, Map ইত্যাদি) | একটি একক মান (যেমন যোগফল, গড়, সর্বোচ্চ ইত্যাদি) |
| পদ্ধতি | collect() মেথড ব্যবহার করা হয় | reduce() মেথড এবং অন্যান্য পরিসংখ্যান পদ্ধতি |
সারসংক্ষেপ
- Aggregation হলো স্ট্রিমের উপাদানগুলোকে একটি সংগ্রহে একত্রিত করার প্রক্রিয়া (যেমন List, Set বা String তৈরি করা)।
- Reduction হলো স্ট্রিমের উপাদানগুলোকে একটি একক মানে সংকুচিত করার প্রক্রিয়া (যেমন যোগফল, গুনফল, পরিসংখ্যান তৈরি করা)।
- Java 8 এর Collectors API-তে অনেক বিল্ট-ইন অপারেশন রয়েছে যা এই দুটি প্রক্রিয়া সহজে করতে সাহায্য করে।
Collectors ব্যবহার করে আপনি সহজেই স্ট্রিমের উপাদানগুলোকে একত্রিত বা সংকুচিত করে বিভিন্ন কার্যকরী ফলাফল অর্জন করতে পারবেন।
Read more