Predicate Interface হল java.util.function প্যাকেজের একটি বিল্ট-ইন ফাংশনাল ইন্টারফেস, যা boolean-valued function রিটার্ন করে। অর্থাৎ, Predicate একটি ফাংশনাল ইন্টারফেস যা একটি ইনপুট গ্রহণ করে এবং তার ভিত্তিতে একটি boolean ফলাফল প্রদান করে (যেমন, একটি শর্ত যাচাই করা)। এটি খুবই উপকারী যখন আপনি কিছু যাচাই করতে চান, যেমন একটি কন্ডিশন চেক করা বা একটি ফিল্টার অপারেশন করা।
Predicate Interface প্রধানত filtering, matching, validation, এবং logical operations এর জন্য ব্যবহৃত হয়।
1. Predicate Interface এর কাঠামো
Predicate<T> ইন্টারফেসে একটি মাত্র abstract method থাকে:
boolean test(T t);
Tহচ্ছে ইনপুট প্যারামিটার টাইপ (যেমন Integer, String, Custom Objects ইত্যাদি)।test(T t)মেথডটি ইনপুট গ্রহণ করে এবং একটিbooleanমান রিটার্ন করে।
2. Predicate Interface এর মৌলিক ব্যবহার
Basic Predicate Example:
import java.util.function.Predicate;
public class PredicateExample {
public static void main(String[] args) {
// A Predicate that checks if a number is greater than 10
Predicate<Integer> isGreaterThanTen = number -> number > 10;
System.out.println(isGreaterThanTen.test(5)); // Output: false
System.out.println(isGreaterThanTen.test(15)); // Output: true
}
}
Explanation:
- এখানে, Predicate isGreaterThanTen একটি ফাংশনাল ইন্টারফেস তৈরি করা হয়েছে যা একটি
Integerইনপুট নিয়ে যাচাই করে, যদি তা 10 এর বেশি হয় তবেtrueরিটার্ন করবে, অন্যথায়false।
3. Predicate Chaining (Combining Predicates)
Java 8 থেকে Predicate এর সাথে logical operations যেমন AND, OR, এবং NEGATE করার সুবিধা রয়েছে। আপনি and(), or(), এবং negate() মেথড ব্যবহার করে একাধিক Predicate একসাথে চেইন করতে পারেন।
Predicate Chaining Example:
import java.util.function.Predicate;
public class PredicateChaining {
public static void main(String[] args) {
Predicate<Integer> isGreaterThanTen = number -> number > 10;
Predicate<Integer> isEven = number -> number % 2 == 0;
// Chaining predicates: Check if a number is greater than 10 AND even
System.out.println(isGreaterThanTen.and(isEven).test(12)); // Output: true
System.out.println(isGreaterThanTen.and(isEven).test(5)); // Output: false
// Chaining predicates with OR: Check if a number is greater than 10 OR even
System.out.println(isGreaterThanTen.or(isEven).test(8)); // Output: true
System.out.println(isGreaterThanTen.or(isEven).test(7)); // Output: false
// Using negate: Check if a number is NOT greater than 10
System.out.println(isGreaterThanTen.negate().test(5)); // Output: true
}
}
Explanation:
- and(): দুটি Predicate একসাথে AND অপারেশন চালায়।
- or(): দুটি Predicate একসাথে OR অপারেশন চালায়।
- negate(): একটি Predicate এর ফলাফল উল্টো করে দেয় (NOT অপারেশন)।
4. Predicate Interface with Collections
Predicate এর ব্যবহার সবচেয়ে বেশি ফিল্টারিং এবং শর্তসাপেক্ষ অপারেশনগুলোতে হয়। আপনি Streams API ব্যবহার করে Predicate এর মাধ্যমে একটি Collection বা List ফিল্টার করতে পারেন।
Predicate with Collections Example:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class PredicateWithCollections {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 12, 8, 21, 3, 14);
// Predicate to check if a number is even
Predicate<Integer> isEven = number -> number % 2 == 0;
// Using Predicate to filter the list
List<Integer> evenNumbers = numbers.stream()
.filter(isEven)
.collect(Collectors.toList());
System.out.println("Even numbers: " + evenNumbers); // Output: [12, 8, 14]
}
}
Explanation:
- Predicate
isEvenব্যবহার করে আমরা stream এর মধ্যে ফিল্টারিং করেছি, যাতে কেবল even সংখ্যাগুলি collect করা হয়। filter(isEven)ফিল্টার অপারেশন ব্যবহার করে Predicate মেথডের সাথে ইন্টারঅ্যাক্ট করে এবং ফলস্বরূপ শুধুমাত্র even সংখ্যাগুলি List হিসেবে রিটার্ন করে।
5. Practical Use Case for Predicate: Validation
Predicate এর মাধ্যমে ডেটা যাচাই বা validation করা খুবই সহজ। আপনি Predicate ব্যবহার করে কাস্টম ডেটা ভ্যালিডেশন করতে পারেন, যেমন checking eligibility, password validation, ইত্যাদি।
Password Validation Example:
import java.util.function.Predicate;
public class PasswordValidator {
public static void main(String[] args) {
// Predicate to check if password has at least one digit
Predicate<String> hasDigit = password -> password.matches(".*\\d.*");
// Predicate to check if password length is at least 8 characters
Predicate<String> lengthAtLeastEight = password -> password.length() >= 8;
// Combine predicates to validate the password
Predicate<String> isValidPassword = hasDigit.and(lengthAtLeastEight);
System.out.println(isValidPassword.test("Password123")); // Output: true
System.out.println(isValidPassword.test("pass123")); // Output: false
}
}
Explanation:
- এখানে দুটি Predicate তৈরি করা হয়েছে: একটি digit চেক করার জন্য এবং অন্যটি length চেক করার জন্য।
- এরপর and() ব্যবহার করে দুটি Predicate একসাথে যোগ করা হয়েছে যা ভ্যালিড পাসওয়ার্ড যাচাই করে।
6. Predicate for Optional
Predicate কে Optional এর সাথে ব্যবহার করে আপনি নাল ভ্যালু যাচাই করতে পারেন এবং নিরাপদভাবে ডেটা প্রসেস করতে পারেন।
Predicate with Optional Example:
import java.util.Optional;
import java.util.function.Predicate;
public class PredicateWithOptional {
public static void main(String[] args) {
Optional<String> username = Optional.of("JohnDoe");
Predicate<String> isNotEmpty = s -> s != null && !s.isEmpty();
boolean result = username.filter(isNotEmpty).isPresent();
System.out.println("Is username present and not empty? " + result); // Output: true
}
}
Explanation:
- Optional ব্যবহার করে আমরা প্রথমে username ভেরিয়েবলের মান চেক করি। filter ব্যবহার করে Predicate যাচাই করে, তারপর isPresent চেক করি।
সারাংশ
Predicate Interface Java Functional Programming এর একটি গুরুত্বপূর্ণ অংশ, যা boolean ফলাফল রিটার্ন করার জন্য ব্যবহার করা হয়। এটি শর্ত যাচাই, filtering, validation, matching ইত্যাদির জন্য খুবই উপকারী। Predicate এর মাধ্যমে আপনি logical operations (AND, OR, NOT) করতে পারেন, এবং তা Collections বা Streams এর সাথে ব্যবহার করে আরও কার্যকরী অপারেশন করতে পারেন। Java 8 এ Predicate এর সাহায্যে ফাংশনাল প্রোগ্রামিং অনেক সহজ হয়ে গেছে, যা কোডকে আরও ক্লিন, স্কেলেবল এবং পড়তে সহজ করে তোলে।