Lambda এবং Closures এর সম্পর্ক

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

316

Lambda Expressions এবং Closures দুটি গুরুত্বপূর্ণ ধারণা যা Functional Programming এ ব্যবহৃত হয়। যদিও এগুলি আলাদা, তবে Java তে Lambda Expressions এবং Closures একে অপরের সাথে সম্পর্কিত এবং একে অপরের উপকারিতা ও কার্যকারিতাকে বৃদ্ধি করে।

এখানে Lambda Expressions এবং Closures এর সম্পর্ক এবং প্রতিটির কার্যকারিতা বিস্তারিতভাবে ব্যাখ্যা করা হবে।


১. Lambda Expressions কি?

Lambda Expressions হল একধরনের anonymous function (অজ্ঞাত ফাংশন) যা একটি নির্দিষ্ট ফাংশনাল ইন্টারফেসের সাথে কাজ করে। এটি সাধারণত ফাংশনাল প্রোগ্রামিং স্টাইলে কাজ করে, যেখানে একটি ফাংশনকে আর্গুমেন্ট হিসেবে পাস করা হয় এবং নির্দিষ্ট কাজটি করার জন্য লজিক দেওয়া হয়।

Lambda Expression এর সাধারণ সিনট্যাক্স:

(parameters) -> expression

উদাহরণ:

(int x, int y) -> x + y

এখানে একটি ল্যাম্বডা এক্সপ্রেশন (int x, int y) -> x + y তৈরি করা হয়েছে যা দুইটি পূর্ণসংখ্যা যোগ করার কাজ করে।


২. Closures কি?

Closure হল একটি ফাংশনাল প্রোগ্রামিং ধারণা, যেখানে একটি ফাংশন একটি বা একাধিক আর্গুমেন্ট বা ভ্যারিয়েবল বাইরের স্কোপ (scope) থেকে গ্রহণ করে এবং সেগুলির মানের সাথে কাজ করে। একটি ক্লোজার মূলত একটি lambda expression বা anonymous function যার মধ্যে বাইরের ভ্যারিয়েবলগুলো অন্তর্ভুক্ত থাকে এবং সেগুলি তার জীবনচক্রের মধ্যে ব্যবহার করা যায়।

এটি এমন একটি ধারণা যেখানে একটি ফাংশন নিজে সম্পূর্ণ থাকে, কিন্তু বাইরের স্কোপে থাকা ভ্যারিয়েবলগুলির উপর নির্ভরশীল থাকে।


৩. Lambda এবং Closures এর সম্পর্ক

Java তে Lambda Expressions ক্লোজারের মতো কাজ করতে পারে। আসলে, Lambda Expression গুলি closures এর মতোই আচরণ করে, কারণ একটি Lambda Expression তার বাইরের স্কোপ থেকে ভ্যারিয়েবল গ্রহণ এবং ব্যবহার করতে পারে। এটি বাইরের ভ্যারিয়েবলগুলির উপর নির্ভরশীল হয়ে থাকে এবং সেই ভ্যারিয়েবলগুলি পরিবর্তন করতে পারে।

Lambda Expression এর মাধ্যমে Closure এর ব্যবহার

একটি Closure এর বৈশিষ্ট্য হল যে এটি নিজের ভিতরে থাকা ফাংশনাল লজিক ছাড়াও বাইরের ভ্যারিয়েবলগুলোকে "গ্র্যাব" করে ব্যবহার করতে পারে। Java তে Lambda Expressions বাইরের ভ্যারিয়েবলগুলির সাথে কাজ করে, যার ফলে Lambda গুলি ক্লোজারের মতো আচরণ করে।

৪. Lambda Expressions এবং Closures এর বাস্তব উদাহরণ

৪.১ Lambda Expression with Closure Example

import java.util.function.IntConsumer;

public class LambdaClosureExample {

    public static void main(String[] args) {
        int factor = 5;

        // Lambda expression using an external variable (closure)
        IntConsumer multiplyByFactor = (n) -> System.out.println(n * factor);

        multiplyByFactor.accept(10);  // Output: 50
    }
}

এখানে, factor একটি বাইরের ভ্যারিয়েবল, এবং এটি Lambda Expression (n) -> System.out.println(n * factor) এর মধ্যে ব্যবহার হচ্ছে। এটি একটি ক্লোজার কারণ factor Lambda Expression এর বাইরের স্কোপ থেকে আসছে এবং Lambda Expression এটি "গ্র্যাব" করে ব্যবহার করছে।

৪.২ Lambda Expression with Modified Closure Example

import java.util.function.IntConsumer;

public class LambdaClosureExample {

    public static void main(String[] args) {
        int factor = 5;

        // Lambda expression using an external variable (closure)
        IntConsumer multiplyByFactor = (n) -> System.out.println(n * factor);

        // Modifying the external variable
        factor = 10;

        multiplyByFactor.accept(10);  // Output: 100
    }
}

এখানে, factor ভ্যারিয়েবলকে পরিবর্তন করা হয়েছে এবং Lambda Expression এর মধ্যে এই পরিবর্তিত মান ব্যবহার করা হয়েছে। এটি নিশ্চিত করে যে ল্যাম্বডা এক্সপ্রেশন বাইরের স্কোপের মান পরিবর্তন করে এবং সেই পরিবর্তিত মানের সাথে কাজ করে। এটি closure এর বৈশিষ্ট্য।

৪.৩ Closure Concept in Java: A Deeper Look

Java তে Lambda Expressions বাইরের ভ্যারিয়েবলগুলি ধরতে পারে এবং effectively final হওয়া উচিত। অর্থাৎ, বাইরের স্কোপে যেসব ভ্যারিয়েবল final বা effectively final (যার মান একবার সেট হওয়ার পর পরিবর্তন হয় না) থাকে, Lambda Expression সেগুলি ব্যবহার করতে পারে।

public class LambdaClosureExample {
    public static void main(String[] args) {
        final int multiplier = 2;  // effectively final variable

        // Lambda expression accessing the external variable (closure)
        Runnable r = () -> System.out.println("Multiplier: " + multiplier);

        r.run();  // Output: Multiplier: 2
    }
}

এখানে, multiplier একটি effectively final ভ্যারিয়েবল এবং Lambda Expression এর ভিতরে এটি ব্যবহার করা হচ্ছে। এটি closure হিসাবে কাজ করে, যেখানে Lambda বাইরের ভ্যারিয়েবল ব্যবহার করতে পারে, তবে সেই ভ্যারিয়েবলটি পরিবর্তন হতে পারে না।


৫. Lambda Expressions এবং Closures এর উপকারিতা

  1. Clean and Readable Code: Lambda Expression এবং Closures কোডকে আরও পরিষ্কার, সংক্ষিপ্ত এবং রিডেবল করে তোলে। ফাংশনাল স্টাইলে কোড লেখার মাধ্যমে কোড ডুপ্লিকেশন কমে এবং বেশি কার্যকারিতা নিশ্চিত হয়।
  2. Null Safety: Lambda Expression এবং Closures ব্যবহার করে আপনি null ভ্যালুর ক্ষেত্রে নিরাপত্তা নিশ্চিত করতে পারেন এবং বিভিন্ন ফাংশনাল অপারেশন যেমন map, filter, reduce ইত্যাদি ব্যবহার করে কাজ করতে পারেন।
  3. Flexible Functionality: Lambda Expression এবং Closures ব্যবহার করার মাধ্যমে আপনি কোডে অধিক functional flexibility পাবেন, যেমন অ্যাসিনক্রোনাস টাস্ক প্রক্রিয়া বা ফাংশনাল চেইনিং ইত্যাদি।
  4. Encapsulation: Closures বাইরের স্কোপ থেকে ভ্যারিয়েবলগুলি capture করে ফাংশনের মধ্যে ব্যবহার করতে পারে, যা বিভিন্ন প্রসেস বা ডেটা encapsulation করে এবং ফাংশনাল প্যারাডাইমে কাজ করে।

সারাংশ

Lambda Expressions এবং Closures ফাংশনাল প্রোগ্রামিং এর মূল অংশ, যা একে অপরের সাথে সম্পর্কিত এবং কোডের ফ্লেক্সিবিলিটি ও রিডেবিলিটি বাড়াতে সহায়ক। Java তে Lambda Expressions কার্যকরভাবে Closures তৈরি করে, যেখানে বাইরের স্কোপের ভ্যারিয়েবলগুলির সাথে কাজ করা হয়। এটি Java প্রোগ্রামিং ভাষায় ফাংশনাল প্রোগ্রামিং পারাদাইমের শক্তি এবং সুবিধা বাস্তবায়ন করে, যা কোডের সংক্ষিপ্ততা, কার্যকারিতা এবং নিরাপত্তা বৃদ্ধি করে।

Content added By
Promotion

Are you sure to start over?

Loading...