Streams এর পরিচিতি

Java Streams API - জাভা ফাংশনাল প্রোগ্রামিং (Java Functional Programming) - Java Technologies

403

Java Streams Java 8 এ Functional Programming ধারণাকে সমর্থন করার জন্য চালু করা হয়েছিল এবং এটি Java প্রোগ্রামিং ভাষায় ডেটা প্রসেসিংয়ের জন্য একটি অত্যন্ত শক্তিশালী বৈশিষ্ট্য। Streams এক ধরনের Abstracted sequence of elements যা আপনাকে ডেটা সংগ্রহের উপরে কাজ করার জন্য একটি declarative পদ্ধতি প্রদান করে। এটি আপনাকে ডেটাকে প্রক্রিয়াকরণের জন্য অনেক সহজ এবং পরিষ্কার উপায় দেয়, বিশেষত যখন আপনি একটি বড় ডেটাসেটের উপর অপারেশন করতে চান।

Streams কি?

Java Streams হল sequence of elements যা functional-style অপারেশন করতে সক্ষম। Stream সরাসরি ডেটা স্টোরেজ (যেমন, Collection, Array, I/O channel) থেকে ডেটা নিয়ে প্রক্রিয়া শুরু করে এবং একাধিক intermediate এবং terminal অপারেশন দিয়ে ডেটাকে প্রসেস করে।

Streams এর মাধ্যমে, আপনি map, filter, reduce এবং অন্যান্য ফাংশনাল অপারেশনগুলো ডেটা সংগ্রহের উপরে কার্যকরভাবে প্রয়োগ করতে পারেন, এবং ডেটা সৃষ্টির পরিবর্তে শুধুমাত্র তার উপর অপারেশন করতে পারেন।

Stream এর বৈশিষ্ট্য:

  1. No Storage: Stream ডেটা স্টোরেজ নয়, বরং এটি ডেটা উৎস থেকে ডেটা প্রক্রিয়া করার জন্য ব্যবহৃত হয়।
  2. Functional in Nature: Stream অপারেশনগুলো ফাংশনাল, যেমন map(), filter(), reduce(), ইত্যাদি।
  3. Lazy Evaluation: Stream অপারেশনগুলো সাধারণত lazy হয়, অর্থাৎ, তারা তখনই কার্যকর হয় যখন একটি terminal operation (যেমন collect(), forEach(), reduce()) চালানো হয়।
  4. Can be consumed only once: Stream একবার ব্যবহৃত হলে পুনরায় ব্যবহার করা যায় না।

Stream-এর প্রধান অপারেশন:

  1. Intermediate Operations:
    • এগুলি lazy অপারেশন, অর্থাৎ, এগুলি ততক্ষণ কাজ করে না যতক্ষণ না একটি terminal operation trigger না হয়। এগুলোর মধ্যে filter, map, sorted, distinct, limit ইত্যাদি অন্তর্ভুক্ত।
    • Example: filter(), map(), distinct()
  2. Terminal Operations:
    • এগুলি ডেটা প্রসেস শেষ করে এবং শেষ ফলাফল রিটার্ন করে (যেমন Collection এ রূপান্তর, আউটপুট দেওয়া, অথবা একটি একক মান রিটার্ন করা)। এগুলোর মধ্যে forEach, collect, reduce ইত্যাদি অন্তর্ভুক্ত।
    • Example: collect(), forEach(), reduce()

Stream-এর প্রধান অপারেশন গুলো:

1. Creating a Stream

Streams তৈরি করার জন্য Java বিভিন্ন পদ্ধতি প্রদান করে। যেমন, Collection থেকে Stream তৈরি করা, অ্যারে থেকে Stream তৈরি করা, বা Stream.of() পদ্ধতি দিয়ে একক মানের স্ট্রিম তৈরি করা।

import java.util.*;
import java.util.stream.*;

public class Main {
    public static void main(String[] args) {
        // Collection থেকে Stream তৈরি
        List<String> list = Arrays.asList("Apple", "Banana", "Orange", "Mango");
        Stream<String> stream = list.stream();
        
        // Array থেকে Stream তৈরি
        int[] numbers = {1, 2, 3, 4, 5};
        IntStream intStream = Arrays.stream(numbers);
        
        // Stream.of() ব্যবহার
        Stream<String> fruitStream = Stream.of("Apple", "Banana", "Orange");
    }
}

2. Intermediate Operations:

Intermediate operations ডেটা ফিল্টার বা ট্রান্সফর্ম করতে ব্যবহৃত হয়, এবং তারা lazily execute হয়।

  • filter(): এটি একটি শর্তের উপর ভিত্তি করে উপাদানগুলো ফিল্টার করে।
  • map(): এটি একটি Function ব্যবহার করে উপাদানগুলিকে পরিবর্তন বা ট্রান্সফর্ম করে।
  • sorted(): এটি স্ট্রিমের উপাদানগুলো সোর্ট করে।

Example of Intermediate Operations:

import java.util.*;
import java.util.stream.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Orange", "Mango");

        // Filter elements that start with 'A'
        list.stream()
            .filter(s -> s.startsWith("A"))
            .forEach(System.out::println);  // Output: Apple

        // Map each string to its length
        list.stream()
            .map(String::length)
            .forEach(System.out::println);  // Output: 5 6 6 5 (lengths of Apple, Banana, Orange, Mango)
    }
}

3. Terminal Operations:

Terminal operations স্ট্রিম প্রসেসিং শেষ করে এবং ফলাফল রিটার্ন করে। এই অপারেশনগুলি স্ট্রিমের উপর অপারেশন সম্পন্ন করে।

  • collect(): এটি একটি Collector ব্যবহার করে স্ট্রিমের উপাদানগুলো একটি Collection-এ রূপান্তরিত করে।
  • forEach(): এটি স্ট্রিমের উপাদানগুলো প্রতি একটি লুপের মাধ্যমে চালায়।
  • reduce(): এটি স্ট্রিমের উপাদানগুলোর উপর একটি একক মান গণনা করে।
  • count(): এটি স্ট্রিমের উপাদানের সংখ্যা রিটার্ন করে।

Example of Terminal Operations:

import java.util.*;
import java.util.stream.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Orange", "Mango");

        // collect to a List
        List<String> result = list.stream()
                                  .filter(s -> s.startsWith("A"))
                                  .collect(Collectors.toList());
        System.out.println(result);  // Output: [Apple]

        // forEach operation
        list.stream().forEach(System.out::println);  // Output: Apple, Banana, Orange, Mango

        // reduce operation (concatenating strings)
        String concatenated = list.stream()
                                  .reduce((s1, s2) -> s1 + " " + s2)
                                  .orElse("No fruits");
        System.out.println(concatenated);  // Output: Apple Banana Orange Mango
    }
}

4. Stream Pipelines:

Stream pipelines সাধারণত intermediate এবং terminal অপারেশনগুলির একটি সংমিশ্রণ। এই pipelines একটি ধারাবাহিক স্ট্রিম প্রসেসিং তৈরি করে।

import java.util.*;
import java.util.stream.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Orange", "Mango");

        // Stream pipeline example
        long count = list.stream()
                         .filter(s -> s.startsWith("A"))
                         .map(String::toUpperCase)
                         .count();
                         
        System.out.println(count);  // Output: 1 (since only "Apple" starts with A)
    }
}

Stream-এর সুবিধা:

  1. Declarative: Java Streams আপনার ডেটা প্রসেসিং কোডকে declarative, অর্থাৎ সহজ এবং বোধগম্য করে তোলে।
  2. Parallelism: Streams কে parallel হিসাবে ব্যবহার করা যায়, যাতে একাধিক প্রসেসর কোরে ডেটা প্রক্রিয়া করা হয়। এটি বড় ডেটাসেট প্রক্রিয়া করার জন্য উপকারী।
  3. Less Boilerplate: Collection বা Array-তে একে একে লুপিং করার পরিবর্তে, Stream-এ মেথড চেইনিং ব্যবহার করে কোড অনেক পরিষ্কার হয়।
  4. Lazy Evaluation: Intermediate operations lazy evaluation দিয়ে কাজ করে, ফলে অপ্রয়োজনীয় ডেটা প্রক্রিয়া না করেই কেবল প্রয়োজনীয় ডেটাতেই কাজ করা হয়।

সংক্ষেপে:

Java Streams হল একটি শক্তিশালী ফিচার যা functional programming ধারণাকে Java তে প্রবর্তন করেছে। এটি ডেটা সংগ্রহের উপরে কার্যকরভাবে বিভিন্ন ধরনের অপারেশন করতে সাহায্য করে যেমন map, filter, reduce, collect ইত্যাদি। Streams আপনার কোডকে আরও পরিষ্কার এবং কার্যকরী করে তোলে এবং parallel processing এর সুবিধাও প্রদান করে, যা বৃহৎ ডেটাসেটের সাথে কাজ করতে সাহায্য করে।

Content added By
Promotion

Are you sure to start over?

Loading...