Closures এর ধারণা

Closures এবং Scope - জাভা ফাংশনাল প্রোগ্রামিং (Java Functional Programming) - Java Technologies

313

Closures হল Functional Programming এর একটি গুরুত্বপূর্ণ ধারণা, যা Java তে Lambda Expressions এবং Anonymous Classes এর মাধ্যমে ব্যবহার করা যায়। এক কথায়, ক্লোজার হলো এমন একটি ফাংশন বা lambda expression যেটি তার আউটসাইড (এনভায়রনমেন্ট) ভ্যারিয়েবলগুলিকে refer করতে এবং retain করতে সক্ষম। Java তে, closures সাধারণত local variables অথবা method parameters এর সাথে কাজ করে, যেগুলি ল্যাম্বডা বা ফাংশনাল ইন্টারফেস এর মধ্যে ব্যবহৃত হয়।

1. Closure এর সংজ্ঞা:

Closure হল একটি ফাংশন বা ল্যাম্বডা এক্সপ্রেশন যা তার আউটসাইড (এনভায়রনমেন্ট) স্কোপ থেকে ভ্যারিয়েবল এবং ডাটা স্টোর করতে পারে, এবং সেই ভ্যারিয়েবলগুলোর মান রিটার্ন বা ম্যানিপুলেট করতে পারে। এটি একটি "function with its lexical environment" হিসাবে কাজ করে।

2. Java তে Closure এর কাজ:

Java তে, closures সাধারণত Lambda Expressions বা Anonymous Classes এর মধ্যে ব্যবহার হয়, যেখানে একটি local variable বা parameter আউটসাইড স্কোপ থেকে capture করা হয় এবং ওই ফাংশনের মধ্যে ব্যবহার করা হয়।

3. Closures এর উদাহরণ:

ধরা যাক, আমাদের একটি ক্লোজার তৈরি করতে হবে যেখানে আমরা একটি local variable কে lambda expression এর মাধ্যমে ব্যবহার করতে পারব।

3.1 Lambda Expression ব্যবহার করে Closure Example:

public class ClosureExample {
    public static void main(String[] args) {
        int multiplier = 2;  // local variable

        // Lambda expression capturing the 'multiplier' variable
        Runnable task = () -> {
            System.out.println("The multiplier is: " + multiplier);
            System.out.println("Result of multiplication: " + (multiplier * 5));
        };

        // Running the task (closure in action)
        task.run();
    }
}

ব্যাখ্যা:

  • এখানে, multiplier একটি local variable যা ল্যাম্বডা এক্সপ্রেশন দ্বারা capture করা হয়েছে।
  • Runnable interface এর run() মেথডের মধ্যে একটি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করা হয়েছে যা multiplier ভ্যারিয়েবলটি রেফারেন্স করে।
  • Closure এর মাধ্যমে multiplier ভ্যারিয়েবলটি আউটসাইড স্কোপ থেকে ইনপুট নিয়ে ল্যাম্বডা এক্সপ্রেশনের মধ্যে ব্যবহৃত হয়েছে।

আউটপুট:

The multiplier is: 2
Result of multiplication: 10

4. Java তে Closure এর ব্যবহার এবং বিশেষত্ব:

  1. Local Variables: Java তে, lambda expressions বা anonymous classes final অথবা effectively final local variables (বা method parameters) কে capture করে রাখতে পারে। অর্থাৎ, lambda expressions বা anonymous classes এ ব্যবহৃত local variablesকে কখনোই পরিবর্তন করা উচিত নয়। একে effectively final বলা হয়, যার মানে variable এর মান পরিবর্তন না হওয়ার শর্তে, তা lambda তে ব্যবহার করা যায়।
    • Final variables: যেগুলি প্রথমবার সেট করার পর পুনরায় মান পরিবর্তন করা হয় না।
    • Effectively final variables: যেগুলি প্রথমবার সেট করার পর মান পরিবর্তন না হলেও, তাদেরকে final হিসাবে ঘোষণা করা হয়নি।
  2. Lambda Expressions: Lambda expressions সাধারণত closures তৈরির জন্য ব্যবহৃত হয়। এদের মধ্যে আউটসাইড স্কোপের ভ্যারিয়েবলকে capture করার ক্ষমতা থাকে।
  3. State Retention: Lambda expressions বা closures আউটসাইড ভ্যারিয়েবলগুলির মানকে নিজের মধ্যে ধারণ করে এবং ভবিষ্যতে সেই মান ব্যবহার করতে পারে।

5. Effectively Final Variables এবং Closures:

Java তে lambda expressions বা anonymous classes এর মধ্যে effectively final ভ্যারিয়েবল ব্যবহার করা যায়। এর মানে হলো যে, আপনি যদি কোনো ভ্যারিয়েবল পরিবর্তন না করেন, তাহলে সেটা final হিসেবে গণ্য হবে এবং lambda expressions বা closures এ ব্যবহার করা যাবে।

5.1 Effectively Final Variable Example:

public class ClosureWithEffectivelyFinal {
    public static void main(String[] args) {
        int threshold = 10;  // Effectively final variable

        // Lambda expression using the 'threshold' variable
        Runnable task = () -> {
            System.out.println("Threshold value: " + threshold);
        };

        // Running the task (closure in action)
        task.run();
    }
}

ব্যাখ্যা:

  • threshold ভ্যারিয়েবলটি effectively final কারণ এটি প্রথমবার সেট হওয়ার পর আর পরিবর্তিত হয়নি।
  • Lambda expression এই effectively final ভ্যারিয়েবলটি capture করতে পারে এবং সেটা ভিতরে ব্যবহার করতে সক্ষম।

আউটপুট:

Threshold value: 10

6. Closures এর সুবিধা:

  1. Encapsulation: Closure একটি নির্দিষ্ট ফাংশনের মধ্যে local state (যেমন ভ্যারিয়েবল) ধারণ করে রাখে, যা প্রোগ্রামকে আরও পরিষ্কার এবং মডুলার করে।
  2. Maintainability: কোড কম হয়ে যায় এবং optional state ব্যবহার করার মাধ্যমে আরও কার্যকরী কোড লেখা সম্ভব।
  3. Improved Readability: কোডে বাইরের ভ্যারিয়েবলগুলি closure এর মাধ্যমে ক্যাপচার হয়ে যাওয়ার ফলে, আরও কমপ্যাক্ট এবং সহজভাবে লেখা যায়।

7. Real-World Example: Closure with Collection API:

একটি সাধারণ উদাহরণ যেখানে আমরা closure ব্যবহার করে List এর মান ফিল্টার করতে পারি:

import java.util.Arrays;
import java.util.List;

public class ClosureWithCollection {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
        int threshold = 3;  // Effectively final variable

        // Using closure (lambda expression) to filter the numbers
        numbers.stream()
            .filter(n -> n > threshold)   // Capturing threshold variable
            .forEach(System.out::println); // Prints numbers greater than 3
    }
}

ব্যাখ্যা:

  • এখানে, threshold ভ্যারিয়েবলটি effectively final এবং এটি lambda expression এর মধ্যে capture হয়ে ব্যবহার হচ্ছে।
  • filter() মেথডটি কেবলমাত্র সেগুলোর সংখ্যাগুলি প্রিন্ট করবে যেগুলি threshold থেকে বড়।

আউটপুট:

4
5
6

8. Java তে Closures এর ব্যবহার এবং সমস্যাগুলি:

  1. Memory Considerations: Closures কিছু ক্ষেত্রে memory consumption বাড়াতে পারে, কারণ তারা আউটসাইড স্কোপের ভ্যারিয়েবল ধরে রাখে।
  2. Thread Safety: যখন closure বিভিন্ন থ্রেডের মাধ্যমে ব্যবহৃত হয়, তখন আপনাকে thread safety নিশ্চিত করতে হবে, কারণ আউটসাইড স্কোপ থেকে ভ্যারিয়েবলগুলো একাধিক থ্রেডের মাধ্যমে ব্যবহৃত হতে পারে।

সারাংশ:

Closures হল এমন ফাংশন যা তার আউটসাইড স্কোপ থেকে ভ্যারিয়েবল এবং স্টেট ধারণ করে এবং সেই ভ্যারিয়েবলগুলোর মান রিটার্ন বা ম্যানিপুলেট করতে পারে। Java তে, closures প্রধানত lambda expressions বা anonymous classes এর মাধ্যমে কাজ করে, এবং এগুলি effectively final বা final ভ্যারিয়েবলগুলিকে capture করতে সক্ষম। এটি Java তে Functional Programming ধারণার একটি গুরুত্বপূর্ণ অংশ এবং কোডকে আরও পরিষ্কার, সংক্ষিপ্ত এবং কার্যকরী করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...