Consumer এবং Supplier Interface

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

295

Java 8-এ functional programming এর ধারণা সমর্থন করতে java.util.function প্যাকেজে বেশ কিছু ইন্টারফেস যোগ করা হয়েছে, যার মধ্যে Consumer এবং Supplier ইন্টারফেস দুটি গুরুত্বপূর্ণ। এই ইন্টারফেস দুটি Java-তে functional-style programming করার জন্য ব্যবহৃত হয়, বিশেষত lambda expressions এবং method references এর সাথে।

এই ইন্টারফেস দুটি সাধারণভাবে functional interfaces হিসেবে কাজ করে, অর্থাৎ এগুলির মধ্যে একটি মাত্র abstract method থাকে, যা ল্যাম্বডা এক্সপ্রেশন বা মেথড রেফারেন্সের মাধ্যমে ইমপ্লিমেন্ট করা যায়।


1. Consumer Interface:

Consumer ইন্টারফেসটি এমন একটি ফাংশনাল ইন্টারফেস যা এক ধরনের ইনপুট নেয় এবং কোনো আউটপুট প্রদান করে না (void return type)। এটি মূলত side-effect তৈরি করতে ব্যবহৃত হয়, যেমন প্রিন্ট করা, ডেটাবেসে ডেটা ইনসার্ট করা, অথবা কোনো অবজেক্ট পরিবর্তন করা।

Consumer Interface এর সিগনেচার:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

এখানে:

  • T: ইনপুট প্যারামিটার টাইপ।
  • accept(T t): একটি ইনপুট গ্রহণ করে এবং কিছু কাজ (সাধারণত সাইড-এফেক্ট) সম্পন্ন করে।

Consumer Interface ব্যবহার:

Example 1:

import java.util.function.Consumer;

public class ConsumerExample {
    public static void main(String[] args) {
        // Lambda expression implementation of Consumer
        Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase());

        printUpperCase.accept("hello");  // Output: HELLO
    }
}

এখানে:

  • Consumer একটি Consumer টাইপের অবজেক্ট যা String ইনপুট নেয় এবং System.out.println() দ্বারা আউটপুট প্রদান করে (side effect)।
  • accept() মেথডের মাধ্যমে ইনপুট প্যারামিটার গ্রহণ করা হয় এবং কাজ সম্পাদিত হয়।

Example 2:

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ConsumerExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // Using Consumer to print each name
        Consumer<String> printName = name -> System.out.println(name);
        
        names.forEach(printName);
    }
}

এখানে:

  • forEach() মেথডের মাধ্যমে Consumer ব্যবহার করে লিস্টের প্রতিটি আইটেম প্রিন্ট করা হচ্ছে।

Chaining Consumers:

আপনি একাধিক Consumer একত্রে যোগ করতে পারেন andThen() মেথড ব্যবহার করে।

Consumer<String> printUpper = str -> System.out.println(str.toUpperCase());
Consumer<String> printLower = str -> System.out.println(str.toLowerCase());

printUpper.andThen(printLower).accept("Hello");

Output:

HELLO
hello

এখানে, প্রথমে printUpper কল হবে, তারপর printLower কল হবে।


2. Supplier Interface:

Supplier ইন্টারফেসটি এমন একটি ফাংশনাল ইন্টারফেস যা কোনো ইনপুট না নিয়ে আউটপুট প্রদান করে। এটি সাধারণত lazy evaluation বা factory methods তৈরি করতে ব্যবহৃত হয়, যেখানে একটি মান প্রাপ্তির জন্য কোনো নির্দিষ্ট অবজেক্ট বা কম্পিউটেশন তৈরি করা হয়।

Supplier Interface এর সিগনেচার:

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

এখানে:

  • T: আউটপুট প্যারামিটার টাইপ।
  • get(): কোনো ইনপুট গ্রহণ না করে একটি আউটপুট প্রদান করে।

Supplier Interface ব্যবহার:

Example 1:

import java.util.function.Supplier;

public class SupplierExample {
    public static void main(String[] args) {
        // Lambda expression implementation of Supplier
        Supplier<Double> randomValue = () -> Math.random();

        System.out.println(randomValue.get());  // Output: Random number between 0.0 and 1.0
    }
}

এখানে:

  • Supplier একটি Supplier টাইপের অবজেক্ট যা কোনো ইনপুট না নিয়ে একটি র্যান্ডম double মান প্রদান করে।
  • get() মেথডের মাধ্যমে আউটপুট প্রদান করা হয়।

Example 2:

import java.util.function.Supplier;

public class SupplierExample {
    public static void main(String[] args) {
        // Supplier for generating a default message
        Supplier<String> defaultMessage = () -> "Hello, World!";

        System.out.println(defaultMessage.get());  // Output: Hello, World!
    }
}

এখানে:

  • Supplier একটি Supplier টাইপের অবজেক্ট যা কোনো ইনপুট না নিয়ে একটি স্ট্যাটিক স্ট্রিং প্রদান করে।

Lazy Initialization with Supplier:

একটি খুব সাধারণ ব্যবহার হল lazy initialization। যখনই কোনো মান প্রয়োজন হবে, তখনই সেটা তৈরি করা হবে।

Supplier<String> lazyMessage = () -> {
    System.out.println("Generating message...");
    return "Lazy Message";
};

System.out.println(lazyMessage.get());  // Output: Generating message... Lazy Message

এখানে, lazyMessage শুধুমাত্র তখনই এক্সিকিউট হবে যখন get() মেথড কল হবে। এটি lazy evaluation এর একটি উদাহরণ।


Consumer এবং Supplier Interface এর মধ্যে পার্থক্য:

FeatureConsumerSupplier
Inputএকটি ইনপুট গ্রহণ করে (একটি প্যারামিটার থাকে)।কোনো ইনপুট গ্রহণ করে না (কেবল আউটপুট প্রদান করে)।
Outputকোনো আউটপুট প্রদান করে না (void return type)।আউটপুট প্রদান করে (generic type T)।
Usageসাধারণত সাইড-এফেক্ট সম্পাদন করতে ব্যবহৃত হয়, যেমন প্রিন্ট করা বা অবজেক্ট পরিবর্তন করা।সাধারণত কোনো মান তৈরি বা প্রদান করতে ব্যবহৃত হয়।
Methodaccept(T t)get()
Typical Use Caseডেটা প্রসেসিং বা সাইড-এফেক্ট তৈরি করা (যেমন, forEach())ডেটা তৈরি বা কোনো মান প্রদান করা (যেমন, get() বা supplier.get())

সারাংশ:

Consumer এবং Supplier ইন্টারফেস দুটি Java 8 এ Functional Programming এর গুরুত্বপূর্ণ অংশ।

  • Consumer এমন একটি ফাংশনাল ইন্টারফেস যা ইনপুট গ্রহণ করে এবং কিছু সাইড-এফেক্ট সম্পাদন করে, যেমন প্রিন্ট করা বা ডেটাবেসে ডেটা ইনসার্ট করা।
  • Supplier কোনো ইনপুট না নিয়ে আউটপুট প্রদান করে, যেমন একটি র্যান্ডম নাম্বার, অথবা স্ট্যাটিক কোনো মান।

Lambda expressions এবং method references এর মাধ্যমে Consumer এবং Supplier ব্যবহারের মাধ্যমে আপনি কার্যকরী এবং পুনরায় ব্যবহারযোগ্য কোড লিখতে পারবেন, যা আপনার অ্যাপ্লিকেশনকে আরও পরিষ্কার এবং কমপ্যাক্ট করতে সাহায্য করবে।

Content added By
Promotion

Are you sure to start over?

Loading...