Comparator Functional Interface
Comparator কী?
Comparator হলো Java-এর একটি Functional Interface, যা ব্যবহার করা হয় অবজেক্টগুলোর মধ্যে তুলনা (comparison) করার জন্য।
- সাধারণত sorting (sort করা)-এর সময় ব্যবহৃত হয়
- Java 8 থেকে এটি Lambda Expression দিয়ে সহজে লেখা যায়
Comparator কেন দরকার?
ধরা যাক, আমাদের একটি Person ক্লাস আছে।
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
এখন আমরা চাই:
- কখনো age অনুযায়ী sort
- কখনো name অনুযায়ী sort
এখানেই Comparator দরকার।
Comparator Interface-এর গঠন
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
compare() মেথড কী রিটার্ন করে?
| ফলাফল | অর্থ |
|---|---|
| negative | o1 < o2 |
| 0 | o1 == o2 |
| positive | o1 > o2 |
পুরোনো পদ্ধতিতে Comparator
Comparator<Person> ageComparator = new Comparator<>() {
@Override
public int compare(Person p1, Person p2) {
return p1.age - p2.age;
}
};
Lambda দিয়ে Comparator (Java 8+)
Age অনুযায়ী sort
Comparator<Person> ageComparator =
(p1, p2) -> p1.age - p2.age;
ব্যবহার
List<Person> persons = List.of(
new Person("Rahim", 30),
new Person("Karim", 25)
);
persons.stream()
.sorted(ageComparator)
.forEach(p -> System.out.println(p.name));
Comparator.comparing() – সবচেয়ে ভালো পদ্ধতি
Java 8+ এ recommended।
Age অনুযায়ী
Comparator<Person> byAge =
Comparator.comparing(p -> p.age);
Name অনুযায়ী
Comparator<Person> byName =
Comparator.comparing(p -> p.name);
Method Reference ব্যবহার
Comparator<Person> byAge =
Comparator.comparing(Person::getAge);
এর জন্য getter থাকতে হবে।
Descending Order (Reverse sort)
Comparator<Person> byAgeDesc =
Comparator.comparing(Person::getAge)
.reversed();
Multiple Field দিয়ে Comparator (Chaining)
প্রথমে age, তারপর name
Comparator<Person> comparator =
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName);
Null-safe Comparator
Null শেষে যাবে
Comparator<Person> comparator =
Comparator.nullsLast(
Comparator.comparing(Person::getName)
);
Null আগে যাবে
Comparator<Person> comparator =
Comparator.nullsFirst(
Comparator.comparing(Person::getName)
);
Stream-এর সাথে Comparator ব্যবহার
persons.stream()
.sorted(Comparator.comparing(Person::getAge))
.forEach(System.out::println);
Comparator vs Comparable
| Comparator | Comparable |
|---|---|
| আলাদা ক্লাস | ক্লাসের ভিতরে |
| একাধিক sorting logic | একটিমাত্র |
| Flexible | Less flexible |
| Lambda-friendly | Lambda না |
বাস্তব উদাহরণ (Order Sorting)
class Order {
double price;
LocalDate date;
}
Comparator<Order> orderComparator =
Comparator.comparing(Order::getPrice)
.thenComparing(Order::getDate);