Сортировка списка с помощью stream.sorted() в Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для сортировки списка в Java с применением метода stream().sorted(), следуйте приведенным ниже указаниям:

Java
Скопировать код
List<String> sorted = list.stream().sorted().collect(Collectors.toList());

Если вам требуется специализированная сортировка, например, в обратном порядке, используйте компаратор:

Java
Скопировать код
List<String> sorted = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());

Не забудьте импортировать Collectors.toList() и Comparator.reverseOrder().

Кинга Идем в IT: пошаговый план для смены профессии

Подробное объяснение

Рассмотрим более детально, что представляет из себя Stream.sorted(). Это промежуточная операция, которая требует знания о всех элементах, аналогично процессу сортировки колоды карт, когда вам необходимо знать все карты.

Сортировка на месте по сравнению с созданием нового списка

Метод stream().sorted() создает новый отсортированный список. Если вам нужно изменить исходный список, используйте метод list.sort():

Java
Скопировать код
list.sort(Comparator.naturalOrder());

Таким образом вы прямо модифицируете оригинальный список. Если же вам необходимо сохранить исходный список в первоначальном виде, просто присвойте результат сортировки новой переменной.

Работа со сложными объектами? Без проблем!

Если список содержит сложные объекты, используйте Comparator.comparing(), чтобы определить, как именно их следует сравнивать:

Java
Скопировать код
List<Person> sortedPeople = people.stream()
                                  .sorted(Comparator.comparing(Person::getAge))
                                  .collect(Collectors.toList());

Таким образом, список будет отсортирован по возрасту.

Сочетание компараторов

Если вам сложно определить приоритет свойств для сортировки, воспользуйтесь командой thenComparing():

Java
Скопировать код
List<Person> sortedPeople = people.stream()
                                  .sorted(Comparator.comparing(Person::getName)
                                        .thenComparingInt(Person::getAge))
                                  .collect(Collectors.toList());

Таким образом, вы добавите дополнительный критерий сортировки в качестве запасного варианта.

Профессиональные советы и возможные препятствия

Рассмотрим некоторые важные аспекты и рекомендации по эффективному использованию stream().sorted().

Точная сортировка

Для сортировки значений типа BigDecimal и других чисел с высокой точностью применяйте соответствующие компараторы:

Java
Скопировать код
List<BigDecimal> sortedDecimals = decimals.stream()
                                          .sorted(Comparator.naturalOrder())
                                          .collect(Collectors.toList());

Проверка корректности сортировки

Убедитесь, что результат сортировки соответствует вашим ожиданиям, например, при помощи юнит-тестов:

Java
Скопировать код
assertTrue(Ordering.natural().isOrdered(sortedList));

Упрощение создания коллекций в Java 16

В Java 16 появилась возможность использования метода toList():

Java
Скопировать код
List<String> sorted = list.stream().sorted().toList();

Создание собственного компаратора

Вы можете создать компаратор с помощью лямбда-выражений:

Java
Скопировать код
Comparator<String> explicitComparator = (s1, s2) -> s1.compareTo(s2);
List<String> sorted = list.stream().sorted(explicitComparator).collect(Collectors.toList());

Визуализация

Пошагово рассмотрим процесс сортировки:

Markdown
Скопировать код
Исходный список:       📦5️⃣ 📦3️⃣ 📦1️⃣ 📦4️⃣ 📦2️⃣
Java
Скопировать код
list.stream().sorted()
Markdown
Скопировать код
Отсортированный список после stream.sorted(): 📦1️⃣ 📦2️⃣ 📦3️⃣ 📦4️⃣ 📦5️⃣

Благодаря сортировке каждый элемент встал на своё место.

Сравнение до и после

Сопоставим исходный список и список после сортировки:

Markdown
Скопировать код
Порядок до сортировки:        📦5️⃣ 📦3️⃣ 📦1️⃣ 📦4️⃣ 📦2️⃣
Порядок после сортировки:     📦1️⃣ 📦2️⃣ 📦3️⃣ 📦4️⃣ 📦5️⃣

Приступаем к результатам

Радуемся упорядоченному списку:

Java
Скопировать код
sorted.forEach(System.out::println);

Проверьте импорты

Убедитесь, что имеются все необходимые импорты:

Java
Скопировать код
import java.util.Arrays;
import java.util.stream.Collectors;

Полезные материалы

  1. Stream (Java Platform SE 8) – Официальная документация всегда поможет вам разобраться в деталях.
  2. Java 8 Stream sorted() Example – Практические примеры использования Stream.sorted().
  3. How to ensure order of processing in java8 streams? – Stack Overflow – Ответы сообщества могут быть очень полезными.
  4. Reduction (The Java™ Tutorials > Collections > Aggregate Operations) – Информация о редукции данных, играющая важную роль в процессе сортировки.
  5. Java 8 Lambda Expressions and Stream API Tutorial – Детальный обзор лямбда-выражений и Stream API в Java 8.
  6. Effective Java 8 Programming Techniques – Полезные приёмы программирования на Языке Java 8.