Predicate Functional Interface
Predicate কী?
Predicate হলো Java-এর একটি Functional Interface, যা মূলত কোনো কন্ডিশন (true / false) যাচাই করার জন্য ব্যবহৃত হয়।
সহজ কথায়:
Predicate = প্রশ্ন (Yes / No)
উদাহরণ:
- সংখ্যা জোড় কি না?
- user active কি না?
- age 18-এর বেশি কি না?
Predicate Interface-এর গঠন
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
test() মেথড:
- ইনপুট নেয়
T - রিটার্ন করে
trueঅথবাfalse
Predicate কেন দরকার?
ধরা যাক, আমাদের একটি List আছে এবং আমরা শর্ত অনুযায়ী ডাটা ফিল্টার করতে চাই।
- পুরোনো পদ্ধতিতে অনেক if-else
- Predicate ব্যবহার করলে কোড হয় clean & reusable
সাধারণ Predicate উদাহরণ
🔹 সংখ্যা জোড় কিনা
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(10)); // true
System.out.println(isEven.test(7)); // false
Stream-এর সাথে Predicate ব্যবহার
সবচেয়ে বেশি ব্যবহার এখানেই হয়।
List<Integer> numbers = List.of(1,2,3,4,5,6);
numbers.stream()
.filter(n -> n > 3)
.forEach(System.out::println);
এখানে filter() এর ভিতরের Lambda আসলে একটি Predicate
Predicate আলাদা করে লিখে ব্যবহার
Predicate<Integer> greaterThanThree = n -> n > 3;
numbers.stream()
.filter(greaterThanThree)
.forEach(System.out::println);
Predicate-এর Default Methods
Predicate-এর কিছু শক্তিশালী default method আছে।
and() – একাধিক শর্ত
Predicate<Integer> isEven = n -> n % 2 == 0;
Predicate<Integer> greaterThanTen = n -> n > 10;
Predicate<Integer> evenAndGreaterThanTen =
isEven.and(greaterThanTen);
System.out.println(evenAndGreaterThanTen.test(12)); // true
or() – যেকোনো একটি শর্ত
Predicate<Integer> lessThanFive = n -> n < 5;
Predicate<Integer> greaterThanTwenty = n -> n > 20;
Predicate<Integer> result =
lessThanFive.or(greaterThanTwenty);
negate() – শর্ত উল্টানো
Predicate<Integer> isOdd = isEven.negate();
Object-এর উপর Predicate
Person উদাহরণ
class Person {
String name;
int age;
}
age >= 18 কি না
Predicate<Person> isAdult =
p -> p.age >= 18;
ব্যবহার
persons.stream()
.filter(isAdult)
.forEach(p -> System.out.println(p.name));
Predicate chaining (বাস্তব উদাহরণ)
Predicate<Person> isAdult = p -> p.age >= 18;
Predicate<Person> nameStartsWithA = p -> p.name.startsWith("A");
Predicate<Person> finalPredicate =
isAdult.and(nameStartsWithA);
Predicate.not() (Java 11+)
Predicate<String> isEmpty = String::isEmpty;
list.stream()
.filter(Predicate.not(isEmpty))
.forEach(System.out::println);
Built-in Predicate Helpers
Predicate<Object> isNull = Objects::isNull;
Predicate<Object> nonNull = Objects::nonNull;
Predicate বনাম Function
| Predicate | Function |
|---|---|
| boolean রিটার্ন করে | অন্য যেকোনো টাইপ |
| Condition check | Transformation |
| filter() | map() |