Simplify your Java code with Streams
Streams API কি?
Streams API হচ্ছে Java 8 এ যুক্ত হওয়া নতুন কিছু ফিচার যা ব্যবহার করে আমরা খুব সহজেই complex computational কাজ করতে পারি । যেমন,
ধরি কাস্টমারের একটি ডাটা সেট আছে । এখন এখান থেকে আমরা কাস্টমারদের লোকেশন অনুযায়ী গ্রুপ করতে চাই আর যেসব কাস্টমারদের লোকেশন ডাটা নেই তাদের আমরা এই ডাটা প্রসেসিং থেকে বাদ দিব ঃ
import java.util.Optional;
class Customer {
String firstName;
String lastName;
Optional<String> country;
public Customer(String firstName, String lastName, Optional<String> country) {
this.firstName = firstName;
this.lastName = lastName;
this.country = country;
}
}
public static void main(String[] args) {
List<Customer> customers = genCustomers(); // Customers List
Map<String, List<Customer>> customersByCountry = new HashMap<>(); // Customer mapping by country
customers.forEach(c -> {
c.country.ifPresent(s -> customersByCountry.computeIfAbsent(s, country -> new ArrayList<>()));
c.country.ifPresent(s -> customersByCountry.computeIfPresent(s, (s1, customerList) -> {
customerList.add(c);
return customerList;
}));
});
customersByCountry.forEach((k, v) -> System.out.printf("%s has %d customers.%n", k, v.size()));
}
// Output
EE has 13334 customers.
BD has 40000 customers.
US has 26666 customers.
এখন উপরের কোডটি আমরা Stream API ব্যবহার করে লিখতে পারি এভাবে,
public static void main(String[] args) {
List<Customer> customers = genCustomers(); // Customers List
Map<String, List<Customer>> customersByCountry = customers
.stream()
.filter(c -> c.country.isPresent())
.collect(Collectors.groupingBy(c -> c.country.get()));
customersByCountry.forEach((k, v) -> System.out.printf("%s has %d customers.%n", k, v.size()));
}
// Output
EE has 13334 customers.
BD has 40000 customers.
US has 26666 customers.
দেখুন দুটো কোড থেকেই আমরা একি আউটপুট পাচ্ছি । কিন্তু দ্বিতীয় কোডটি অনেক বেশি রিডেবল এবং ক্লিন । আমরা কোডটি পড়লেই বুঝতে পারতেছি এখানে কি কাজ হচ্ছে ।
Stream API এর কমন অপারেশন গুলো হল ঃ
- map: Map ব্যবহার করা হয় যখন আমরা কোন একটি একক ডাটা নিয়ে কাজ করতে চাই । যেমন, যদি আমরা আমাদের কাস্টমার ডাটা র First
Name কে uppercase এ পরিবর্তন করতে চাই তাহলে আমরা এভাবে করতে পারি ।
Sakib -> SAKIB
customers
.stream()
.map(c -> c.firstName.toUpperCase());
- reduce: ব্যবহার করতে পারি যখন ডাটা সেট থেকে আমরা কোন সামগ্রিক রেজাল্ট চাই । যেমন Sum, Average, Max, Min বের করা ইত্যাদি ।
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 7);
int sum = numbers
.stream()
.reduce(0, Integer::sum);
System.out.printf("Sum: %d%n", sum);
-
filter: ডাটাসেট থেকে কোন ডাটা বাদ দিতে ব্যবহার করতে পারি ।
-
collect: কিভাবে আমরা আমাদের ফাইনাল আউটপুট চাই তা কালেক্ট ব্যবহার করে নির্ধারণ করতে পারি । উদাহরণ স্বরূপ উপরের কাস্টমার ডাটা গ্রুপ করা হতে পারে ।
Streams API এর সুবিধা ঃ
- আমরা অনেক গোছানো কোড লিখতে পারব যেটা কোডের Readability বাড়াবে এবং Maintain করাও সহজ ।
parallelStream()
এর মাধ্যমে আমরা multi-core এর সুবিধা নিতে পারি, যা computational টাইম কমাবে । ইত্যাদি ।