Java 8 এ ফাংশনাল প্রোগ্রামিং ধারণা সমর্থিত হয়েছে এবং এর মধ্যে Functional Interfaces একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। ফাংশনাল ইন্টারফেসগুলি এমন ইন্টারফেস যা কেবল একটিমাত্র অ্যাবস্ট্র্যাক্ট মেথড ধারণ করে, এবং এগুলি ল্যাম্বডা এক্সপ্রেশন এবং মেথড রেফারেন্সের মাধ্যমে ব্যবহার করা হয়।
এখানে Predicate, Function, Consumer, এবং Supplier ফাংশনাল ইন্টারফেসগুলো সম্পর্কে আলোচনা করা হল:
১. Predicate
Predicate একটি ফাংশনাল ইন্টারফেস যা একটি কন্ডিশন যাচাই করতে ব্যবহৃত হয় এবং এটি একটি বুলিয়ান মান (true অথবা false) রিটার্ন করে। অর্থাৎ, এটি একটি ফাংশন যা কোন এক অবজেক্টের উপর একটি শর্ত পরীক্ষা করে।
মেথড:
boolean test(T t)– এই প্যারামিটারটি গ্রহণ করে এবং একটি বুলিয়ান রিটার্ন করে।default Predicate<T> and(Predicate<? super T> other)– একটি নতুন পেডিকেট তৈরি করে যা দুইটি পেডিকেটের AND অপারেশন সম্পন্ন করে।default Predicate<T> or(Predicate<? super T> other)– একটি নতুন পেডিকেট তৈরি করে যা দুইটি পেডিকেটের OR অপারেশন সম্পন্ন করে।default Predicate<T> negate()– পেডিকেটের নেগেশন রিটার্ন করে।
উদাহরণ:
import java.util.function.Predicate;
public class PredicateExample {
public static void main(String[] args) {
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false
}
}এখানে isEven একটি পেডিকেট যা পরীক্ষা করে যে সংখ্যাটি সঠিকভাবে বিভাজ্য কিনা ২ দ্বারা।
২. Function<T, R>
Function একটি ফাংশনাল ইন্টারফেস যা একটি আর্গুমেন্ট গ্রহণ করে এবং একটি ফলাফল প্রদান করে। এটি সাধারণত ইনপুট মান থেকে আউটপুট মান তৈরি করতে ব্যবহৃত হয়।
মেথড:
R apply(T t)– প্যারামিটার গ্রহণ করে এবং ফলাফল রিটার্ন করে।default <V> Function<T, V> andThen(Function<? super R, ? extends V> after)– দুইটি ফাংশনকে একত্রে ব্যবহার করার জন্য একটি কম্পোজড ফাংশন তৈরি করে।default <V> Function<V, R> compose(Function<? super V, ? extends T> before)– বর্তমান ফাংশনের আগে অন্য একটি ফাংশন প্রয়োগ করার জন্য একটি কম্পোজড ফাংশন তৈরি করে।
উদাহরণ:
import java.util.function.Function;
public class FunctionExample {
public static void main(String[] args) {
Function<Integer, String> intToString = n -> "Number: " + n;
System.out.println(intToString.apply(10)); // Output: Number: 10
}
}এখানে intToString একটি ফাংশন যা একটি পূর্ণসংখ্যা কে স্ট্রিং এ রূপান্তরিত করে।
৩. Consumer
Consumer একটি ফাংশনাল ইন্টারফেস যা একটি ইনপুট প্যারামিটার গ্রহণ করে এবং কোন ফলাফল রিটার্ন করে না। এটি সাধারণত একটি সাইড এফেক্ট করার জন্য ব্যবহৃত হয়।
মেথড:
void accept(T t)– এই অপারেশনটি প্যারামিটার গ্রহণ করে এবং কিছু কার্যকরী কাজ করে।default Consumer<T> andThen(Consumer<? super T> after)– দুটি কনজিউমার একত্রে কাজ করার জন্য একটি নতুন কনজিউমার তৈরি করে।
উদাহরণ:
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
Consumer<String> printMessage = message -> System.out.println(message);
printMessage.accept("Hello, World!"); // Output: Hello, World!
}
}এখানে printMessage একটি কনজিউমার যা একটি স্ট্রিং মেসেজ প্রিন্ট করে।
৪. Supplier
Supplier একটি ফাংশনাল ইন্টারফেস যা কোন ইনপুট গ্রহণ না করে এবং একটি আউটপুট প্রদান করে। এটি সাধারণত একটি মান সরবরাহ বা তৈরি করার জন্য ব্যবহৃত হয়।
মেথড:
T get()– একটি মান প্রদান করে।
উদাহরণ:
import java.util.function.Supplier;
public class SupplierExample {
public static void main(String[] args) {
Supplier<Double> randomNumber = () -> Math.random();
System.out.println(randomNumber.get()); // Output: A random double value
}
}এখানে randomNumber একটি সাপ্লায়ার যা প্রতিবার একটি র্যান্ডম নম্বর প্রদান করে।
এই ফাংশনাল ইন্টারফেসগুলোর ব্যবহার:
- Predicate: যখন কোনো শর্ত যাচাই করতে হয় এবং তার ফলাফল বুলিয়ান হতে হয়, তখন পেডিকেট ব্যবহার করা হয়। এটি সাধারণত স্ট্রিম ফিল্টারিং বা শর্ত যাচাই করার জন্য ব্যবহার হয়।
- উদাহরণ: একটি তালিকা থেকে নির্দিষ্ট শর্তে ফিল্টার করা।
- Function: যখন ডেটা ট্রান্সফর্ম করতে হয়, যেমন একটি অবজেক্টের ওপর কাজ করে অন্য একটি অবজেক্ট তৈরি করা।
- উদাহরণ: একটি সংখ্যাকে স্ট্রিং-এ রূপান্তর করা।
- Consumer: যখন কোনো ইনপুট প্যারামিটার নিয়ে কোন সাইড এফেক্ট বা কার্যক্রম করতে হয়, কিন্তু কোন আউটপুট রিটার্ন করতে হয় না।
- উদাহরণ: একটি তালিকাকে প্রিন্ট করা।
- Supplier: যখন কোনো আউটপুট প্রদান করতে হয় এবং ইনপুট প্রয়োজন নেই।
- উদাহরণ: র্যান্ডম ডাটা জেনারেট করা।
সারসংক্ষেপ
Java 8-এ Predicate, Function, Consumer, এবং Supplier ফাংশনাল ইন্টারফেসগুলি কোডিং প্রক্রিয়াকে সহজ এবং কার্যকরী করে তোলে। এগুলো ল্যাম্বডা এক্সপ্রেশন এবং স্ট্রিম API এর মাধ্যমে ফাংশনাল প্রোগ্রামিং ধারণাকে বাস্তবায়ন করতে সহায়ক, এবং প্রতিটি ফাংশনাল ইন্টারফেসের নিজস্ব ব্যবহারিক ক্ষেত্র রয়েছে যা ডেভেলপারদের জন্য কার্যকরী।
Read more