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

ফলাফলঅর্থ
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);