Сортировка списка объектов по свойствам в Java
Быстрый ответ
Чтобы отсортировать список объектов типа Person
по полю age
в Java 8, применяется Comparator
:
List<Person> people = ...;
people.sort(Comparator.comparing(Person::getAge));
Для обратной сортировки следует использовать следующий код:
people.sort(Comparator.comparing(Person::getAge).reversed());
Comparator: универсальный инструмент сортировки
Comparator
позволяет установить правила сортировки объектов. Одно из его преимуществ – возможность сортировки по нескольким параметрам с помощью thenComparing
:
people.sort(Comparator.comparing(Person::getLastName).thenComparing(Person::getFirstName));
В Java 8 появилась функция обработки null
значений через Comparator.nullsFirst
:
people.sort(Comparator.comparing(Person::getAge, Comparator.nullsFirst(Integer::compareTo)));
Чтобы ускорить сортировку, можно применить специализированные методы для примитивов:
people.sort(Comparator.comparingInt(Person::getAge));
Не забывайте контролировать типы объектов, чтобы избежать ошибки ClassCastException
.
Пользовательский Comparator: применение индивидуальных правил сортировки
Вы можете задать собственные правила сортировки, переопределив метод compare
:
people.sort(new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getBirthday().compareTo(p2.getBirthday());
}
});
Совет: храните часто используемые экземпляры Comparator
в виде static final
переменных.
Лямбда-выражения для упрощения
С лямбда-выражениями код становится более социализированным и современным:
people.sort((p1, p2) -> p1.getAge() – p2.getAge());
Визуализация
Сортировка объектов напоминает расстановку книг:
До: [📚, 📔, 📘, 📙, 📕]
После: [📕, 📔, 📘, 📙, 📚]
Сравнение свойств объектов аналогично сравнению размеров книг:
| Объект | Свойство |
| 📚 | Высокая |
| 📔 | Низкая |
| 📘 | Средняя |
| 📙 | Выше |
| 📕 | Ниже |
Сортировка для профессионалов
Естественный порядок: встроенные сортировки
Реализация интерфейса Comparable
позволяет использовать естественный порядок объектов:
class Person implements Comparable<Person> {
// Реализация класса...
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}
}
Collections.sort(people);
Üslожненная многокритериальная сортировка
Вы можете создать различные компараторы для сортировки по множественным критериям:
Comparator<Person> byHeight = Comparator.comparing(Person::getHeight);
Comparator<Person> byWeight = Comparator.comparing(Person::getWeight);
people.sort(byHeight.thenComparing(byWeight));
Использование потоков в Java с методом sorted
Можно использовать Comparator
в потоках данных:
List<Person> sortedList = people.stream()
.sorted(Comparator.comparing(Person::getAge))
.collect(Collectors.toList());
Как избежать популярных ошибок при сортировке
Особое внимание уделяйте типизации объектов, обработке null
значений и оптимизации с помощью специализированных методов.
Полезные материалы
- Comparator (Java Platform SE 8) — документация Java по
Comparator
. - Lambda Expressions (The Java Tutorials) — гид по лямбда-выражениям.
- Stream (Java Platform SE 8) — информация о потоках в Java.
- Java Programming Tutorial – 85 – Sorting Lists of Objects — видеоурок про сортировку объектов.
- [Java 8 Lambdas [Book]](https://www.oreilly.com/library/view/java-8-lambdas/9781449370831/) — книга о лямбда-выражениях в Java 8.
- Method References in Java 8 — статья о ссылках на методы в Java 8.