tgoop.com/javaarchivebooks/252
Create:
Last Update:
Last Update:
Сортировка списка и костыль в JDK
Вести абстрактные разговоры о разработке легко и приятно. Можно два часа рассуждать, что такое хорошее API, но гораздо полезнее обсудить конкретные примеры. Сегодня разберём метод сортировки.
Если показать вопрос перед постом питонисту, он однозначно выберет list.sort()
. Хотя бы потому что в питоне есть такой метод.
Класс Integer реализует интерфейс Comparable
, сортировка чисел — базовая функциональность любого языка программирования. Так что метод sort()
максимально логичен.
Однако в интерфейсе List нет такого метода, только
void sort(Comparator<? super E> c) {…}Для элементарной операции сортировки чисел приходится писать
list.sort(Comparator.naturalOrder())Код с Comparator.naturalOrder() похож на какой-то костыль. Под капотом не происходит ничего особенного, реализация компаратора очень простая:
(
с1, с2) -> c1.compareTo(c2)
❓ Так зачем писать так сложно? Почему в интерфейсе List нет метода sort()?Сейчас расскажу:)
Java создавался как язык для больших и долгоживущих приложений, и его основные ценности — стабильность и обратная совместимость.
C начала 2000-х в JDK есть метод
Collections.sort(List)
. Статический метод, который меняет внутреннее состояние аргумента. Сейчас это порицается, но в те времена было норм.В больших компаниях классы JDK часто расширяли удобными методами, в том числе сортировкой в функциональном стиле:
CustomList sorted = list.sort();Спустя много лет стало понятно, что экземплярные методы сортировки — это классно, и надо добавить такой метод в JDK. Чтобы текущие реализации списков не сломались, это должен быть дефолтный метод в интерфейсе List.
Но есть проблема. Допустим, на проекте есть такой класс:
public class CustomList implements List {Допустим, в java 8 в интерфейс List добавили метод
public CustomList sort() {…}
}
default void sort() {…}Старый метод не может переопределить дефолтный. тк возвращаемые значения не совместимы. Поэтому проекты, которые определили свой функциональный sort в начале 2000-х, перестанут компилироваться. Пользователи будут недовольны.
Многие проекты полагаются на свой sort, поэтому разработчики JDK не стали добавлять его в интерфейс. Метод sort(Comparator) использовался редко, поэтому теперь он с нами.
У Stream API нет проблем с совместимостью, так что для стримов есть прекрасный метод sorted(). Для коллекций метод sorted() есть в Kotlin💖
(обратите внимание на суффикс -ed, всё по правилам функционального подхода)
Ответ на вопрос перед постом: отсортировать список можно так:
✅
list.sort(Comparator.naturalOrder());
✅ list = list.stream().sorted().toList();
Если вам понравился list.sort()
, значит у вас хороший вкус на API. К сожалению, у java свои загоны, поэтому этого метода в JDK нет.BY Уютное сообщество джавистов
Share with your friend now:
tgoop.com/javaarchivebooks/252