Java 8 থেকে শুরু করে, java.util.function প্যাকেজটি ফাংশনাল প্রোগ্রামিং ধারণাকে সমর্থন করার জন্য একাধিক ফাংশনাল ইন্টারফেস অন্তর্ভুক্ত করেছে। এই ফাংশনাল ইন্টারফেসগুলো Java 8 এ ল্যাম্বডা এক্সপ্রেশন এবং স্ট্রিম API ব্যবহার করার জন্য খুবই কার্যকরী। ফাংশনাল ইন্টারফেস এমন একটি ইন্টারফেস যা শুধুমাত্র একটি অ্যাবস্ট্রাক্ট মেথড থাকে, এবং এটি ল্যাম্বডা এক্সপ্রেশন বা মেথড রেফারেন্সের মাধ্যমে সহজে বাস্তবায়ন করা যায়।
java.util.function প্যাকেজে বেশ কয়েকটি গুরুত্বপূর্ণ ফাংশনাল ইন্টারফেস রয়েছে, যেগুলো বিভিন্ন ধরণের ফাংশনাল প্রোগ্রামিং কাজের জন্য ব্যবহৃত হয়। এখানে কিছু গুরুত্বপূর্ণ ফাংশনাল ইন্টারফেস আলোচনা করা হলো:
১. Predicate
Predicate<T> ইন্টারফেস একটি আর্গুমেন্ট গ্রহণ করে এবং একটি boolean মান রিটার্ন করে। এটি সাধারণত শর্ত যাচাই করার জন্য ব্যবহৃত হয়।
সিনট্যাক্স:
boolean test(T t);ব্যবহার উদাহরণ:
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
// Predicate ব্যবহার
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false
}
}এখানে, test() মেথড একটি পূর্ণসংখ্যা গ্রহণ করে এবং চেক করে যে এটি একটি সোজা সংখ্যা কিনা।
২. Function<T, R>
Function<T, R> ইন্টারফেস একটি ইনপুট আর্গুমেন্ট গ্রহণ করে এবং একটি আউটপুট রিটার্ন করে। এটি প্রক্রিয়া করার জন্য খুবই সাধারণ একটি ইন্টারফেস।
সিনট্যাক্স:
R apply(T t);ব্যবহার উদাহরণ:
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
// Function ব্যবহার
Function<String, Integer> stringLength = str -> str.length();
System.out.println(stringLength.apply("Hello")); // 5
}
}এখানে, apply() মেথড একটি স্ট্রিং গ্রহণ করে এবং তার দৈর্ঘ্য রিটার্ন করে।
৩. Consumer
Consumer<T> ইন্টারফেস একটি আর্গুমেন্ট গ্রহণ করে কিন্তু কোনো রিটার্ন মান প্রদান করে না। এটি সাধারণত আর্গুমেন্টের উপর কোনো অপারেশন করার জন্য ব্যবহৃত হয়, যেমন প্রিন্ট করা বা ডেটা পরিবর্তন করা।
সিনট্যাক্স:
void accept(T t);ব্যবহার উদাহরণ:
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
// Consumer ব্যবহার
Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase());
printUpperCase.accept("hello"); // HELLO
}
}এখানে, accept() মেথড একটি স্ট্রিং গ্রহণ করে এবং তার uppercase রূপ প্রিন্ট করে।
৪. Supplier
Supplier<T> ইন্টারফেস কোনো আর্গুমেন্ট গ্রহণ করে না, তবে এটি একটি মান রিটার্ন করে। এটি সাধারণত মান উৎপাদন করার জন্য ব্যবহৃত হয়।
সিনট্যাক্স:
T get();ব্যবহার উদাহরণ:
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
// Supplier ব্যবহার
Supplier<String> getString = () -> "Hello, World!";
System.out.println(getString.get()); // Hello, World!
}
}এখানে, get() মেথড একটি স্ট্রিং রিটার্ন করে।
৫. UnaryOperator
UnaryOperator<T> ইন্টারফেস Function<T, T> এর একটি বিশেষ রূপ। এটি একটি আর্গুমেন্ট গ্রহণ করে এবং একই ধরনের একটি আউটপুট রিটার্ন করে। এটি সাধারণত ইনপুট আর্গুমেন্টের উপরে একটি পরিবর্তন সাধন করার জন্য ব্যবহৃত হয়।
সিনট্যাক্স:
T apply(T t);ব্যবহার উদাহরণ:
import java.util.function.UnaryOperator;
public class Main {
public static void main(String[] args) {
// UnaryOperator ব্যবহার
UnaryOperator<Integer> square = num -> num * num;
System.out.println(square.apply(5)); // 25
}
}এখানে, apply() মেথড একটি পূর্ণসংখ্যা গ্রহণ করে এবং তার বর্গফল রিটার্ন করে।
৬. BinaryOperator
BinaryOperator<T> ইন্টারফেস দুটি একে অপরের সমান ধরনের আর্গুমেন্ট গ্রহণ করে এবং একটি সমান ধরনের আউটপুট রিটার্ন করে। এটি সাধারণত দুটি মানের মধ্যে কোনো গাণিতিক বা লজিক্যাল অপারেশন করতে ব্যবহৃত হয়।
সিনট্যাক্স:
T apply(T t1, T t2);ব্যবহার উদাহরণ:
import java.util.function.BinaryOperator;
public class Main {
public static void main(String[] args) {
// BinaryOperator ব্যবহার
BinaryOperator<Integer> add = (a, b) -> a + b;
System.out.println(add.apply(10, 20)); // 30
}
}এখানে, apply() মেথড দুটি পূর্ণসংখ্যা গ্রহণ করে এবং তাদের যোগফল রিটার্ন করে।
৭. IntPredicate, LongPredicate, DoublePredicate
IntPredicate, LongPredicate, এবং DoublePredicate ইন্টারফেসগুলির কার্যকারিতা Predicate এর মতো, তবে তারা যথাক্রমে int, long, এবং double টাইপের আর্গুমেন্ট গ্রহণ করে এবং একটি boolean মান রিটার্ন করে।
ব্যবহার উদাহরণ:
import java.util.function.IntPredicate;
public class Main {
public static void main(String[] args) {
// IntPredicate ব্যবহার
IntPredicate isPositive = num -> num > 0;
System.out.println(isPositive.test(5)); // true
}
}সারসংক্ষেপ
java.util.function প্যাকেজটি Java 8 থেকে শুরু করে ফাংশনাল প্রোগ্রামিংয়ের ধারণাকে সহজতর করেছে এবং ল্যাম্বডা এক্সপ্রেশন, স্ট্রিম API, এবং ফাংশনাল ইন্টারফেসের মাধ্যমে কোড লেখার প্রক্রিয়া আরও কার্যকরী ও স্বচ্ছ করেছে। এই প্যাকেজের বিভিন্ন ফাংশনাল ইন্টারফেস, যেমন Predicate, Function, Consumer, Supplier, UnaryOperator, BinaryOperator, ইত্যাদি, ডেভেলপারদের বিভিন্ন ধরণের অপারেশন সহজভাবে সম্পাদন করতে সাহায্য করে।
Read more