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() মেথড কী রিটার্ন করে?

ফলাফলঅর্থ
negativeo1 < o2
0o1 == o2
positiveo1 > 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

ComparatorComparable
আলাদা ক্লাসক্লাসের ভিতরে
একাধিক sorting logicএকটিমাত্র
FlexibleLess flexible
Lambda-friendlyLambda না


বাস্তব উদাহরণ (Order Sorting)

class Order {
double price;
LocalDate date;
}
Comparator<Order> orderComparator =
Comparator.comparing(Order::getPrice)
.thenComparing(Order::getDate);

Share