Ответ
Comparator<T> — это функциональный интерфейс для определения внешнего (альтернативного) порядка сортировки, независимого от класса объектов. Он предоставляет метод compare(T o1, T o2) для сравнения двух аргументов.
| Ключевое отличие: | Критерий | Comparable<T> |
Comparator<T> |
|---|---|---|---|
| Пакет | java.lang |
java.util |
|
| Метод | int compareTo(T o) |
int compare(T o1, T o2) |
|
| Смысл | Определяет естественный порядок (внутренний для класса) | Определяет произвольный порядок (внешний, отдельный класс/лямбда) | |
| Влияние на класс | Модифицирует исходный класс (реализация интерфейса) | Не требует изменения исходного класса | |
| Количество вариантов | Один (естественный) | Множество (по разным полям и правилам) |
Примеры использования Comparator:
-
Сортировка строк по длине (лямбда):
List<String> words = Arrays.asList("apple", "fig", "banana"); Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length(); words.sort(byLength); // [fig, apple, banana] -
Цепочка компараторов (сортировка по нескольким полям):
List<Person> people = ...; people.sort( Comparator.comparing(Person::getLastName) // Сначала по фамилии .thenComparing(Person::getAge) // Затем по возрасту .reversed() // В обратном порядке ); -
Сортировка по null-безопасному полю:
Comparator<Person> safeComparator = Comparator.nullsLast(Comparator.comparing(Person::getName));
Области применения:
- Сортировка коллекций, когда класс не реализует
Comparable. - Задание порядка, отличного от естественного.
- Использование в
SortedSet(например,TreeSet) иSortedMap(TreeMap) с кастомным порядком. - Передача логики сравнения как параметра (стратегия).