sakib.ninja sakib.ninja

Simplify your Java code with Streams

Aug 31, 2025 3 min read #java#stream

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 টাইম কমাবে । ইত্যাদি ।