Skill

Method References (মেথড রেফারেন্স)

জাভা (Java 8) - Computer Programming

309

Java 8 এ একটি নতুন বৈশিষ্ট্য হিসেবে মেথড রেফারেন্স (Method References) যোগ করা হয়েছে, যা ল্যাম্বডা এক্সপ্রেশন এর চেয়েও আরও সংক্ষিপ্ত এবং পরিষ্কার উপায়ে মেথড ব্যবহার করার সুযোগ দেয়। মেথড রেফারেন্স একটি বিদ্যমান মেথডকে ল্যাম্বডা এক্সপ্রেশন হিসেবে ব্যবহার করার একটি আরও কমপ্যাক্ট পদ্ধতি। এটি মূলত একটি মেথডের নামকে রেফারেন্স (উল্লেখ) করে এবং সেই মেথডকে সরাসরি কার্যকরী পদ্ধতিতে রূপান্তরিত করে।

মেথড রেফারেন্স এর গঠন

মেথড রেফারেন্সে সাধারণভাবে নিচের গঠন অনুসরণ করা হয়:

ClassName::methodName

এখানে:

  • ClassName: যে ক্লাসে মেথডটি সংজ্ঞায়িত রয়েছে।
  • methodName: যে মেথডটি কল করা হবে।

মেথড রেফারেন্সের মাধ্যমে আপনি ল্যাম্বডা এক্সপ্রেশন এর জন্য একটি বিদ্যমান মেথড ব্যবহার করতে পারেন, যা কোডকে আরও পরিষ্কার ও সংক্ষিপ্ত করে তোলে।


মেথড রেফারেন্স এর প্রকারভেদ

১. স্ট্যাটিক মেথড রেফারেন্স (Static Method Reference)

স্ট্যাটিক মেথড রেফারেন্স এমন একটি মেথডের রেফারেন্স যা কোনো ক্লাসের মধ্যে স্ট্যাটিকভাবে সংজ্ঞায়িত থাকে। এটি ClassName::methodName আকারে লেখা হয়।

উদাহরণ:

class Printer {
    public static void printMessage(String message) {
        System.out.println(message);
    }
}

public class MethodReferenceExample {
    public static void main(String[] args) {
        // মেথড রেফারেন্স ব্যবহার
        Consumer<String> printer = Printer::printMessage;
        printer.accept("Hello, World!");  // Output: Hello, World!
    }
}

এখানে, Printer::printMessage একটি স্ট্যাটিক মেথড রেফারেন্স, যা Consumer ফাংশনাল ইন্টারফেসের accept() মেথডে ব্যবহৃত হচ্ছে।


২. ইনস্ট্যান্স মেথড রেফারেন্স (Instance Method Reference)

ইনস্ট্যান্স মেথড রেফারেন্স এমন একটি মেথডের রেফারেন্স যা কোনো নির্দিষ্ট অবজেক্টের জন্য ইন্সট্যান্স মেথড হিসেবে সংজ্ঞায়িত থাকে। এটি objectReference::methodName আকারে লেখা হয়।

উদাহরণ:

class Printer {
    public void printMessage(String message) {
        System.out.println(message);
    }
}

public class MethodReferenceExample {
    public static void main(String[] args) {
        Printer printer = new Printer();
        // ইনস্ট্যান্স মেথড রেফারেন্স ব্যবহার
        Consumer<String> printerConsumer = printer::printMessage;
        printerConsumer.accept("Hello, Instance Method!");  // Output: Hello, Instance Method!
    }
}

এখানে, printer::printMessage একটি ইনস্ট্যান্স মেথড রেফারেন্স, যা নির্দিষ্ট Printer অবজেক্টের মেথডকে রেফারেন্স করে।


৩. ইনস্ট্যান্স মেথড রেফারেন্স (With Specific Object)

এটা এমন একটি রেফারেন্স, যেখানে আপনি একটি নির্দিষ্ট অবজেক্টের ইনস্ট্যান্স মেথডকে রেফারেন্স করেন।

উদাহরণ:

class Printer {
    public void printMessage(String message) {
        System.out.println(message);
    }
}

public class MethodReferenceExample {
    public static void main(String[] args) {
        Printer printer = new Printer();
        // মেথড রেফারেন্স ব্যবহার
        Runnable r = () -> printer.printMessage("Printed by instance reference");
        r.run();  // Output: Printed by instance reference
    }
}

এখানে, printer::printMessage মেথড রেফারেন্স ব্যবহৃত হচ্ছে।


৪. কনস্ট্রাক্টর রেফারেন্স (Constructor Reference)

কনস্ট্রাক্টর রেফারেন্সে, আপনি একটি ক্লাসের কনস্ট্রাক্টরকে মেথড রেফারেন্স হিসেবে ব্যবহার করেন। এটি ClassName::new আকারে লেখা হয়। এটি বিশেষ করে ফ্যাক্টরি মেথডে ব্যবহৃত হয়।

উদাহরণ:

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class MethodReferenceExample {
    public static void main(String[] args) {
        // কনস্ট্রাক্টর রেফারেন্স ব্যবহার
        Supplier<Person> personSupplier = () -> new Person("John");
        Person person = personSupplier.get();
        System.out.println(person.getName());  // Output: John
    }
}

এখানে, Person::new কনস্ট্রাক্টর রেফারেন্সের মাধ্যমে Person অবজেক্ট তৈরি করা হয়েছে।


মেথড রেফারেন্স এর সুবিধা

  1. কোডের পরিষ্কারতা বৃদ্ধি: মেথড রেফারেন্স কোডকে ছোট এবং পরিষ্কার করে তোলে। ল্যাম্বডা এক্সপ্রেশন এর চেয়ে মেথড রেফারেন্স সাধারণত আরও সংক্ষিপ্ত এবং পরিষ্কার হয়।
  2. কমপ্যাক্ট কোড: একই কাজ করার জন্য মেথড রেফারেন্সের মাধ্যমে কোড আরও কমপ্যাক্ট হয়, যা কোডের রিডেবিলিটি এবং পারফরম্যান্স বাড়ায়।
  3. ফাংশনাল প্রোগ্রামিং ধারণার সমর্থন: মেথড রেফারেন্স ফাংশনাল প্রোগ্রামিং ধারণার শক্তিশালী পদ্ধতি হিসেবে কাজ করে, যেখানে আপনি ফাংশন হিসেবে মেথডকে পাস করতে পারেন।

সারসংক্ষেপ

Java 8 এ মেথড রেফারেন্স একটি শক্তিশালী বৈশিষ্ট্য, যা ল্যাম্বডা এক্সপ্রেশন ব্যবহার করার চেয়ে আরও পরিষ্কার এবং সংক্ষিপ্ত উপায়ে একটি বিদ্যমান মেথডকে রেফারেন্স করার সুযোগ দেয়। এটি কোডের পাঠযোগ্যতা এবং কার্যকারিতা উন্নত করে। স্ট্যাটিক মেথড, ইনস্ট্যান্স মেথড, এবং কনস্ট্রাক্টর রেফারেন্স এর মাধ্যমে ফাংশনাল প্রোগ্রামিংয়ের সুবিধা নেওয়া সম্ভব হয়।

Content added By

Method References Java 8 এ পরিচিত একটি নতুন বৈশিষ্ট্য যা Lambda Expressions এর একটি শর্টকাট হিসেবে কাজ করে। এটি Java 8 এর ফাংশনাল প্রোগ্রামিং ধারণাকে আরও শক্তিশালী ও সহজ করে তোলে। Method References ব্যবহার করে, আপনি সরাসরি মেথডের নামকে রেফারেন্স করতে পারেন, যা কোডকে আরও পরিষ্কার এবং পাঠযোগ্য করে তোলে।


Method References এর ধারণা

Method References হল একটি সংক্ষিপ্ত রূপ যা মেথড কলকে Lambda Expression এর মাধ্যমে লেখা হয়। সাধারণত, আপনি Lambda Expression ব্যবহার করে একটি মেথড কল করতে পারেন, তবে Method Reference এর মাধ্যমে আপনি একই কাজটি আরও সংক্ষিপ্তভাবে করতে পারেন, যেখানে শুধু মেথডের নাম উল্লেখ করা হয়। এটি মূলত Lambda Expression এর -> অপারেটরের পরিবর্তে মেথড রেফারেন্সের :: অপারেটর ব্যবহার করে।

সিনট্যাক্স:

ClassName::methodName

এটি Lambda Expression এর সমতুল্য, যা নির্দিষ্ট মেথডকে রেফারেন্স করে।


Method References এর ধরন

Java-তে মোট চারটি ধরনের Method References ব্যবহার করা যেতে পারে:

১. স্ট্যাটিক মেথড রেফারেন্স (Static Method Reference)

স্ট্যাটিক মেথডকে সরাসরি রেফারেন্স করতে ব্যবহার করা হয়।

class MathUtils {
    public static int square(int x) {
        return x * x;
    }
}

public class Main {
    public static void main(String[] args) {
        // স্ট্যাটিক মেথড রেফারেন্স
        Function<Integer, Integer> squareFunction = MathUtils::square;
        System.out.println(squareFunction.apply(5));  // আউটপুট: 25
    }
}

এখানে, MathUtils::square হলো একটি Method Reference যা square মেথডকে রেফারেন্স করছে।

২. ইনস্ট্যান্স মেথড রেফারেন্স (Instance Method Reference)

এটি কোনো অবজেক্টের ইনস্ট্যান্স মেথডকে রেফারেন্স করতে ব্যবহৃত হয়।

class Greeter {
    public void greet(String name) {
        System.out.println("Hello, " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Greeter greeter = new Greeter();
        
        // ইনস্ট্যান্স মেথড রেফারেন্স
        Consumer<String> greeterConsumer = greeter::greet;
        greeterConsumer.accept("John");  // আউটপুট: Hello, John
    }
}

এখানে, greeter::greet একটি Method Reference যা greet মেথডকে greeter অবজেক্টের সাথে রেফারেন্স করছে।

৩. ইনস্ট্যান্স মেথড রেফারেন্স (Particular Object)

যেকোনো ইনস্ট্যান্সের মেথড রেফারেন্স করতে, আপনি সুনির্দিষ্ট অবজেক্টের নাম ব্যবহার করতে পারেন। সাধারণত এটি অনেকটা পূর্বের ধরণের মতোই, তবে এক্ষেত্রে অবজেক্টটি নির্দিষ্ট থাকে।

class Printer {
    public void printUpperCase(String s) {
        System.out.println(s.toUpperCase());
    }
}

public class Main {
    public static void main(String[] args) {
        Printer printer = new Printer();
        
        // ইনস্ট্যান্স মেথড রেফারেন্স (Particular Object)
        Consumer<String> printerConsumer = printer::printUpperCase;
        printerConsumer.accept("hello");  // আউটপুট: HELLO
    }
}

৪. কন্সট্রাক্টর রেফারেন্স (Constructor Reference)

এটি ক্লাসের কন্সট্রাক্টরকে রেফারেন্স করতে ব্যবহৃত হয়।

class Person {
    String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        // কন্সট্রাক্টর রেফারেন্স
        Supplier<Person> personSupplier = () -> new Person("John");
        
        // অথবা Method Reference দিয়ে করা যেতে পারে
        Supplier<Person> personSupplierRef = Person::new;
        System.out.println(personSupplierRef.get().getName());  // আউটপুট: John
    }
}

এখানে, Person::new কন্সট্রাক্টর রেফারেন্স, যা Person ক্লাসের কন্সট্রাক্টরকে রেফারেন্স করছে।


কেন Method References ব্যবহার করা হয়

১. কোডের সঙ্কলন কমানো (Reduces Code Complexity)

Method References কোডকে অনেক সঙ্কলিত এবং পরিষ্কার করে তোলে। এটি Lambda Expression এর তুলনায় আরও সংক্ষিপ্ত এবং সহজবোধ্য উপায়ে মেথড কলকে বাস্তবায়ন করে।

Lambda Expression এর তুলনায় Method Reference আরো পাঠযোগ্য এবং রিডেবল।

২. ক্লিন কোড (Cleaner Code)

Method References কোডকে পরিষ্কার এবং সংক্ষিপ্ত করে। এটি একই কার্যকলাপকে আরও ভালোভাবে রিফ্লেক্ট করে এবং কোডের অব্যবহৃত অংশগুলিকে অপসারণ করে।

৩. ফাংশনাল প্রোগ্রামিং ধারণা (Supports Functional Programming Paradigm)

Java 8 এ Lambda Expressions এবং Method References ফাংশনাল প্রোগ্রামিং ধারণা প্রয়োগ করার জন্য সহায়ক। Method References ফাংশনাল প্রোগ্রামিংয়ের মৌলিক ধারণাগুলির সাথে সঙ্গতিপূর্ণ।

৪. কম ত্রুটি সম্ভাবনা (Less Error-Prone)

Method References ব্যবহারে Lambda Expression এর তুলনায় কোডে কম ত্রুটি হওয়ার সম্ভাবনা থাকে। কারণ Method Reference সরাসরি একটি মেথডের নামকে রেফারেন্স করে, যেখানে Lambda Expression এর মাধ্যমে কোনো অপ্রত্যাশিত ভুল হতে পারে।

৫. ব্যবহারযোগ্যতা (Reusability)

Method References কোড পুনঃব্যবহারযোগ্যতা উন্নত করে। আপনি যদি একই মেথড বারবার কল করেন, Method References তার পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।


সারসংক্ষেপ

Method References হল Lambda Expressions এর একটি উন্নত বিকল্প, যা কোডকে আরও সংক্ষিপ্ত, পরিষ্কার এবং রিডেবল করে তোলে। এটি Java 8 এর ফাংশনাল প্রোগ্রামিং ধারণাকে সমর্থন করে এবং ফাংশনাল ইন্টারফেসের সঙ্গে মেথড রেফারেন্স ব্যবহার করে কার্যকারিতা বৃদ্ধি করে। Method References ব্যবহারে কোডের জটিলতা কমে, তা আরও রক্ষণাবেক্ষণযোগ্য হয় এবং ত্রুটি সৃষ্টির সম্ভাবনা কমে যায়।

Content added By

Java-তে বিভিন্ন ধরনের মেথড এবং অবজেক্ট থাকে যেগুলোর ব্যবহার ও সিনট্যাক্স আলাদা আলাদা। এখানে Syntax এবং চারটি ধরন: Static, Instance, Constructor, এবং Arbitrary Object মেথডের ব্যবহার ও তাদের সিনট্যাক্স ব্যাখ্যা করা হলো।


১. Syntax (সিনট্যাক্স)

Java-তে সিনট্যাক্স হল কোড লেখার নির্দিষ্ট নিয়ম এবং কাঠামো যা ডেভেলপারদের প্রোগ্রাম তৈরি করতে সাহায্য করে। একটি সাধারণ মেথড সিনট্যাক্স এইভাবে থাকে:

returnType methodName(parameters) {
    // method body
}

যেখানে,

  • returnType: মেথডের রিটার্ন টাইপ (যেমন, int, String, void ইত্যাদি)
  • methodName: মেথডের নাম
  • parameters: প্যারামিটার বা আর্গুমেন্ট (যদি থাকে)
  • method body: মেথডের কার্যকলাপ যা {} এর মধ্যে থাকে

২. Static Method (স্ট্যাটিক মেথড)

Static মেথড একটি ক্লাসের সাথে সম্পর্কিত, অবজেক্টের সাথে নয়। এটি সাধারণত ক্লাস লেভেলে ব্যবহৃত হয় এবং এতে কোনো অবজেক্ট তৈরি করা ছাড়াই সরাসরি ক্লাসের মাধ্যমে অ্যাক্সেস করা যায়। স্ট্যাটিক মেথডে ক্লাসের স্ট্যাটিক ভেরিয়েবল এবং অন্যান্য স্ট্যাটিক মেথড এক্সেস করা সম্ভব, তবে এটি ইন্সট্যান্স ভেরিয়েবল বা ইন্সট্যান্স মেথড এক্সেস করতে পারে না।

Syntax:

class MyClass {
    static void myStaticMethod() {
        System.out.println("This is a static method.");
    }
}

ব্যবহার:

public class Main {
    public static void main(String[] args) {
        MyClass.myStaticMethod(); // স্ট্যাটিক মেথড কল
    }
}

এখানে myStaticMethod() স্ট্যাটিক মেথড হিসেবে কাজ করছে এবং এটি MyClass ক্লাসের মাধ্যমে সরাসরি কল করা হচ্ছে।


৩. Instance Method (ইন্সট্যান্স মেথড)

Instance মেথড হলো এমন মেথড যা একটি অবজেক্টের সাথে সম্পর্কিত। এই মেথডকে এক্সিকিউট করার জন্য অবশ্যই একটি অবজেক্ট তৈরি করতে হয়। এটি অবজেক্টের ইন্সট্যান্স ভেরিয়েবল এবং ইন্সট্যান্স মেথড এক্সেস করতে পারে, তবে স্ট্যাটিক ভেরিয়েবল বা মেথড এক্সেস করতে পারে না।

Syntax:

class MyClass {
    void myInstanceMethod() {
        System.out.println("This is an instance method.");
    }
}

ব্যবহার:

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj.myInstanceMethod(); // ইন্সট্যান্স মেথড কল
    }
}

এখানে myInstanceMethod() একটি ইন্সট্যান্স মেথড, এবং এটি একটি অবজেক্টের মাধ্যমে কল করা হয়েছে।


৪. Constructor (কনস্ট্রাক্টর)

Constructor একটি বিশেষ ধরনের মেথড, যেটি একটি ক্লাসের অবজেক্ট তৈরি করার সময় স্বয়ংক্রিয়ভাবে কল হয়। কনস্ট্রাক্টর মেথডের নাম ক্লাসের নামের মতোই হয় এবং এটি কোনো রিটার্ন টাইপ নেয় না (যদিও এটি একটি মেথডের মতো আচরণ করে)। কনস্ট্রাক্টর সাধারণত অবজেক্টের প্রাথমিক মান সেট করতে ব্যবহৃত হয়।

Syntax:

class MyClass {
    MyClass() { // কনস্ট্রাক্টর
        System.out.println("Constructor is called.");
    }
}

ব্যবহার:

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass(); // কনস্ট্রাক্টর কল
    }
}

এখানে, MyClass() কনস্ট্রাক্টরটি অবজেক্ট তৈরি করার সময় কল হয় এবং কনস্ট্রাক্টরের ভিতরে থাকা কোড কার্যকর হয়।


৫. Arbitrary Object Method (অ্যারবিট্রারি অবজেক্ট মেথড)

Arbitrary Object Method এমন মেথড যা কোনো নির্দিষ্ট অবজেক্টের মাধ্যমে কল করা হয়, তবে এটি ইন্সট্যান্স মেথডের সাথে একইভাবে কাজ করে। এখানে "অ্যারবিট্রারি" বলতে বোঝানো হয়েছে যে, মেথডটি যেকোনো অবজেক্টের মাধ্যমে কল হতে পারে এবং এর কোনো নির্দিষ্ট অবজেক্ট বা ডেটা টাইপের সাথে সম্পর্কিত নয়। এটি সাধারণত ফাংশনাল বা গেট/সেট মেথড হিসেবে ব্যবহৃত হয়।

Syntax:

class MyClass {
    void arbitraryObjectMethod(String str) {
        System.out.println("Arbitrary method called with value: " + str);
    }
}

ব্যবহার:

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj.arbitraryObjectMethod("Hello, World!"); // arbitraryObjectMethod কল
    }
}

এখানে arbitraryObjectMethod() একটি সাধারণ মেথড, যা যেকোনো অবজেক্টের মাধ্যমে কল হতে পারে।


সারসংক্ষেপ

Java-তে Static, Instance, Constructor, এবং Arbitrary Object মেথডগুলোর প্রত্যেকটি আলাদা আলাদা উদ্দেশ্য নিয়ে ব্যবহৃত হয়:

  • Static Method ক্লাসের সাথে সম্পর্কিত, অবজেক্ট ছাড়া এক্সেস করা যায়।
  • Instance Method অবজেক্টের সাথে সম্পর্কিত, অবজেক্ট তৈরি করে এক্সেস করা যায়।
  • Constructor একটি অবজেক্ট তৈরি করার সময় স্বয়ংক্রিয়ভাবে কল হয়।
  • Arbitrary Object Method সাধারণত যেকোনো অবজেক্টের মাধ্যমে কল হতে পারে এবং এটি সাধারণ মেথড হিসেবে ব্যবহৃত হয়।

এই মেথডগুলোর সিনট্যাক্স এবং ব্যবহার বুঝে সঠিকভাবে কোড করা Java প্রোগ্রামিংয়ে একটি গুরুত্বপূর্ণ দক্ষতা।

Content added By

Lambda Expressions এবং Method References Java 8-এ ফাংশনাল প্রোগ্রামিংয়ের গুরুত্বপূর্ণ বৈশিষ্ট্য। এই দুটি বৈশিষ্ট্যই ফাংশনাল ইন্টারফেসে অ্যানোনিমাস ফাংশন ব্যবহার করতে সাহায্য করে, তবে তাদের মধ্যে কিছু মূল পার্থক্য রয়েছে। এখানে আমরা Lambda Expressions এবং Method References এর মধ্যে পার্থক্য বিশ্লেষণ করব।


১. Lambda Expressions (ল্যাম্বডা এক্সপ্রেশন)

Lambda Expressions হল একটি সংক্ষিপ্ত এবং অ্যানোনিমাস (নামবিহীন) ফাংশন যা একক ফাংশনাল ইন্টারফেসের জন্য ব্যবহৃত হয়। এটি কোডকে আরো ছোট এবং পরিষ্কার করতে সাহায্য করে।

সিনট্যাক্স:

(parameters) -> expression

এটি একটি ইনপুট প্যারামিটার গ্রহণ করে এবং একটি এক্সপ্রেশন বা স্টেটমেন্ট রিটার্ন করে।

উদাহরণ:

// ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে
List<String> names = Arrays.asList("John", "Jane", "Mike");
names.forEach(name -> System.out.println(name));  // প্রিন্ট করবে সকল নাম

এখানে, name -> System.out.println(name) একটি ল্যাম্বডা এক্সপ্রেশন যা প্রতিটি উপাদানকে প্রিন্ট করবে।

ব্যবহার:

  • ল্যাম্বডা এক্সপ্রেশন একটি অ্যানোনিমাস ফাংশন হিসাবে কাজ করে, এবং এক বা একাধিক ইনপুট প্যারামিটার নিয়ে একটি এক্সপ্রেশন বা স্টেটমেন্ট রিটার্ন করে।
  • এটি ফাংশনাল ইন্টারফেসের একমাত্র মেথডের জন্য একটি ইমপ্লিমেন্টেশন সরবরাহ করে।

২. Method References (মেথড রেফারেন্স)

Method References একটি সহজ পদ্ধতি যা ল্যাম্বডা এক্সপ্রেশনকে আরো সংক্ষিপ্ত এবং পরিষ্কার করতে ব্যবহৃত হয়। এটি একটি বিদ্যমান মেথডকে রেফারেন্স করার জন্য ব্যবহৃত হয়, যেখানে ল্যাম্বডা এক্সপ্রেশনের কাজ একইভাবে করা সম্ভব।

সিনট্যাক্স:

ClassName::methodName

এটি বিদ্যমান কোনো মেথডের রেফারেন্স সরাসরি ব্যবহার করে।

উদাহরণ:

// মেথড রেফারেন্স ব্যবহার করে
List<String> names = Arrays.asList("John", "Jane", "Mike");
names.forEach(System.out::println);  // প্রিন্ট করবে সকল নাম

এখানে, System.out::println একটি মেথড রেফারেন্স যা System.out.println() মেথডে রেফারেন্স করছে এবং ল্যাম্বডা এক্সপ্রেশন ব্যবহার না করেই নামগুলো প্রিন্ট করছে।

ব্যবহার:

  • Method References ব্যবহার করার মাধ্যমে আপনি একটি বিদ্যমান মেথডের রেফারেন্স সরাসরি ব্যবহার করতে পারেন।
  • এটি কোডকে আরো পরিষ্কার এবং সংক্ষিপ্ত করে তোলে, কারণ আপনি নতুন কোনো ফাংশন তৈরি না করে সরাসরি বিদ্যমান মেথড ব্যবহার করেন।

Lambda Expressions এবং Method References এর মধ্যে পার্থক্য:

বৈশিষ্ট্যLambda ExpressionsMethod References
সংজ্ঞাএকটি অ্যানোনিমাস ফাংশন যা ইনপুট প্যারামিটার গ্রহণ করে এবং একটি এক্সপ্রেশন বা স্টেটমেন্ট রিটার্ন করে।বিদ্যমান কোনো মেথডের রেফারেন্স ব্যবহার করে ফাংশনাল ইন্টারফেসের জন্য একটি কার্যকরী প্রোগ্রাম তৈরি করা।
সিনট্যাক্স(parameters) -> expressionClassName::methodName
ব্যবহারল্যাম্বডা এক্সপ্রেশন দিয়ে নতুন ফাংশন তৈরি করা হয়।বিদ্যমান মেথডের রেফারেন্স সরাসরি ব্যবহার করা হয়।
পঠনযোগ্যতাসাধারণত দীর্ঘ হতে পারে এবং কিছুটা জটিল।সহজ এবং সংক্ষিপ্ত, কোড পড়তে সহজ।
ফাংশনাল ইন্টারফেসেএকক ফাংশনাল ইন্টারফেসের মেথডের জন্য কার্যকরী মেথড তৈরি করে।বিদ্যমান মেথডের রেফারেন্স প্রদান করে।
কোডের কার্যকারিতাকোনো নতুন লজিক যোগ করতে সাহায্য করে।বিদ্যমান মেথডের পুনরায় ব্যবহার করতে সাহায্য করে।

উদাহরণ তুলনা:

Lambda Expression:

List<String> names = Arrays.asList("John", "Jane", "Mike");
names.forEach(name -> System.out.println(name));  // ল্যাম্বডা এক্সপ্রেশন

Method Reference:

List<String> names = Arrays.asList("John", "Jane", "Mike");
names.forEach(System.out::println);  // মেথড রেফারেন্স

এই উদাহরণে, দুটো ক্ষেত্রেই কোডের আউটপুট হবে একরকম, তবে মেথড রেফারেন্স ব্যবহার করলে কোড আরো সংক্ষিপ্ত এবং পরিষ্কার হয়।


সারসংক্ষেপ

  • Lambda Expressions একটি অ্যানোনিমাস ফাংশন যা ফাংশনাল ইন্টারফেসের জন্য একটি কার্যকরী মেথড তৈরি করে।
  • Method References একটি বিদ্যমান মেথডের রেফারেন্স সরাসরি ব্যবহার করে, কোডের পঠনযোগ্যতা এবং সংক্ষিপ্ততা বৃদ্ধি করে।

যখন কোনো বিদ্যমান মেথড ব্যবহার করা সম্ভব, তখন Method References অধিকাংশ ক্ষেত্রে পছন্দনীয়, কারণ এটি কোডকে আরও পরিষ্কার এবং সংক্ষিপ্ত করে। তবে যখন নতুন লজিক তৈরি করতে হয়, তখন Lambda Expressions ব্যবহার করা হয়।

Content added By

Java 8-এ Method References একটি নতুন বৈশিষ্ট্য যা ল্যাম্বডা এক্সপ্রেশনকে আরও সোজা এবং পাঠযোগ্য করে তোলে। এটি মূলত ল্যাম্বডা এক্সপ্রেশনকে সংক্ষিপ্তভাবে প্রকাশ করার একটি উপায়। মেথড রেফারেন্স ব্যবহার করে আপনি সরাসরি কোনো মেথডকে রেফারেন্স করতে পারেন, যা ল্যাম্বডা এক্সপ্রেশন ব্যবহার করার চেয়ে আরও পরিষ্কার এবং সহজ।

Method Reference-এর তিনটি প্রধান ধরনের সিনট্যাক্স রয়েছে:

  1. স্ট্যাটিক মেথড রেফারেন্স: ClassName::methodName
  2. অবজেক্ট মেথড রেফারেন্স: instance::methodName
  3. কনস্ট্রাক্টর রেফারেন্স: ClassName::new

এখানে আমরা বিভিন্ন ধরনের মেথড রেফারেন্সের উদাহরণ দেখবো।


১. স্ট্যাটিক মেথড রেফারেন্স

ধরা যাক, আমাদের একটি স্ট্যাটিক মেথড আছে যা দুটি পূর্ণসংখ্যা যোগফল নির্ণয় করে। ল্যাম্বডা এক্সপ্রেশন ব্যবহার করার পরিবর্তে, আমরা মেথড রেফারেন্স ব্যবহার করতে পারি।

উদাহরণ:

public class Main {
    // স্ট্যাটিক মেথড
    public static int add(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        // ল্যাম্বডা এক্সপ্রেশন
        MathOperation addition = (a, b) -> add(a, b);

        System.out.println("Sum using Lambda: " + addition.operate(5, 3));

        // মেথড রেফারেন্স
        MathOperation addRef = Main::add;

        System.out.println("Sum using Method Reference: " + addRef.operate(5, 3));
    }
}

@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

এখানে Main::add মেথড রেফারেন্স ব্যবহার করে আমরা add মেথডকে সরাসরি রেফারেন্স করেছি, যা ল্যাম্বডা এক্সপ্রেশন (a, b) -> add(a, b) এর সমতুল্য।


২. অবজেক্ট মেথড রেফারেন্স

ধরা যাক, আমাদের একটি ক্লাসে একটি সাধারণ মেথড আছে, এবং আমরা এটি কোনো অবজেক্টের মাধ্যমে কল করতে চাই। মেথড রেফারেন্স ব্যবহার করে অবজেক্ট মেথডও কল করা যেতে পারে।

উদাহরণ:

public class Printer {
    public void printMessage(String message) {
        System.out.println(message);
    }

    public static void main(String[] args) {
        Printer printer = new Printer();

        // ল্যাম্বডা এক্সপ্রেশন
        MessagePrinter messagePrinterLambda = message -> printer.printMessage(message);
        messagePrinterLambda.print("Hello using Lambda");

        // মেথড রেফারেন্স
        MessagePrinter messagePrinterRef = printer::printMessage;
        messagePrinterRef.print("Hello using Method Reference");
    }
}

@FunctionalInterface
interface MessagePrinter {
    void print(String message);
}

এখানে printer::printMessage হল অবজেক্ট মেথড রেফারেন্স যা printer অবজেক্টের printMessage মেথডকে রেফারেন্স করে।


৩. কনস্ট্রাক্টর রেফারেন্স

কনস্ট্রাক্টর রেফারেন্স ব্যবহার করে আমরা একটি নতুন অবজেক্ট তৈরি করতে পারি। এটি একটি কনস্ট্রাকটরের মাধ্যমে নতুন ইনস্ট্যান্স তৈরি করে।

উদাহরণ:

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void greet() {
        System.out.println("Hello, " + name);
    }

    public static void main(String[] args) {
        // কনস্ট্রাক্টর রেফারেন্স
        PersonCreator creator = Person::new;
        
        // নতুন Person অবজেক্ট তৈরি
        Person person = creator.create("John");

        person.greet();  // Output: Hello, John
    }
}

@FunctionalInterface
interface PersonCreator {
    Person create(String name);
}

এখানে Person::new কনস্ট্রাক্টর রেফারেন্স ব্যবহার করে Person ক্লাসের একটি নতুন অবজেক্ট তৈরি করা হয়েছে।


৪. মেথড রেফারেন্স এবং স্ট্রিম API

Method references স্ট্রিম API-র সাথে খুবই জনপ্রিয়। নিচে একটি উদাহরণ দেওয়া হলো যেখানে আমরা স্ট্রিম ব্যবহার করে একটি তালিকা থেকে এমন নামগুলো বের করেছি যেগুলো "J" অক্ষর দিয়ে শুরু হয়।

উদাহরণ:

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

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Mike", "Mia");

        // মেথড রেফারেন্স ব্যবহার
        names.stream()
             .filter(Main::startsWithJ)
             .forEach(System.out::println);  // Output: John, Jane
    }

    public static boolean startsWithJ(String name) {
        return name.startsWith("J");
    }
}

এখানে, Main::startsWithJ মেথড রেফারেন্স ব্যবহার করে আমরা startsWithJ মেথডটি filter অপারেশনের জন্য রেফারেন্স করেছি, এবং System.out::println মেথড রেফারেন্স ব্যবহার করে প্রতিটি নাম প্রিন্ট করেছি।


সারসংক্ষেপ

Method References Java 8-এ একটি শক্তিশালী বৈশিষ্ট্য যা ল্যাম্বডা এক্সপ্রেশনের চেয়ে কোডকে আরও পরিষ্কার এবং সহজ করে তোলে। এটি আপনাকে কোনো মেথডের নাম সরাসরি রেফারেন্স করার সুযোগ দেয়, এবং আপনি বিভিন্ন ধরনের মেথড রেফারেন্স (স্ট্যাটিক মেথড, অবজেক্ট মেথড, কনস্ট্রাক্টর রেফারেন্স) ব্যবহার করে কোডের কার্যকারিতা বাড়াতে পারেন। স্ট্রিম API-তে মেথড রেফারেন্সের ব্যবহার কোডকে আরও সুন্দর এবং কার্যকরী করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...