Java 21: sequenced collections

или "фича, которая опоздала на 25 лет".



19 сентября выходит java 21, и среди прочего там будет JEP 431: Sequenced Collections.



В чём суть изменений?



В JDK добавится новый интерфейс SequencedCollection. В него войдут методы, которые должны были появиться в джаве ещё в 98 году. Простые операции, для которых каждый раз пишется маленький велосипедик🚲



♨️ Пример 1: получить последний элемент в списке



Сейчас это так:

last = list.get(list.size() - 1);



В java 21 наконец-то появится специальный метод:

last = list.getLast();



♨️ Пример 2: пройти список в обратном порядке



Сейчас это так:

for(int i=list.size(); i>0; i--){

int value = list.get(i));

}



Выглядит жутко. Альтернатива — использовать Collections.reverse:



List<Integer> reversed = new ArrayList<>(list);

Collections.reverse(reversed);

reversed.forEach(…);



Выглядит симпатичнее, но здесь море лишних действий: создаём новую(!) коллекцию, переставляем её элементы и только потом делаем обход.



В java 21 всё гораздо проще:

list.reversed().forEach(…)



Метод reversed не меняет исходную коллекцию и возвращает view с обратным порядком обхода.



♨️ Пример 3: обойти LinkedHashSet



LinkedHashSet — список с уникальными элементами. Хотя это список, класс реализует только интерфейс Set. Поэтому работы с индексами нет вообще.



Получить первый элемент ещё можно:

first = linkedHashSet.iterator().next();



А вот последний — никак, надо полностью обходить структуру. Код писать не буду, слишком громоздкий.



В java 21 те же операции выполняются легко и просто:

first = linkedHashSet.getFirst();

last = linkedHashSet.getLast();



Резюме



В java 21 появится интерфейс SequencedCollection с методами

▫️ SequencedCollection<E> reversed()

▫️ void addFirst(E)

▫️ void addLast(E)

▫️ E getFirst()

▫️ E getLast()

▫️ E removeFirst()

▫️ E removeLast()



Плюс интерфейсы SequencedSet и SequencedMap с тем же функционалом.



Новые методы появятся в ArrayList, LinkedList, HashSet, LinkedHashMap, LinkedHashSet, частично в TreeSet и некоторых других классах.



Было бы здорово увидеть эти методы 25 лет назад, но лучше поздно, чем никогда:)