Colecții Secvențiate în Java: SequencedCollection, SequencedSet și SequencedMap în Java

Ghid complet pentru Colecțiile Secvențiate introduse în Java 21 (JEP 431): unificarea accesului la primul și ultimul element prin getFirst(), getLast() și vizualizarea inversată cu reversed().

Sintaxă
list.getFirst() | list.getLast() | list.addFirst(x) | list.reversed() | map.reversed()

Deși framework-ul java.util.Collections este considerat una dintre cele mai bune biblioteci din istoria programării, el a conținut o scăpare arhitecturală bizară timp de peste 25 de ani: lipsea o interfață comună pentru colecțiile care mențin o ordine definită a elementelor.

Pentru a obține primul sau ultimul element dintr-o colecție ordonată, dezvoltatorii trebuiau să folosească metode complet divergente:

  • Pentru List: list.get(0) și list.get(list.size() - 1)
  • Pentru Deque: deque.getFirst() și deque.getLast()
  • Pentru LinkedHashSet: set.iterator().next() (iar pentru ultimul element trebuia iterată întreaga mulțime!)

Stabilizată în Java 21 LTS (JEP 431), noua ierarhie Sequenced Collections unifică toate aceste structuri sub o interfață coerentă și uniformă.

Utilizarea Noilor Metode SequencedCollection
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class SequencedCollectionsDemo {
    public static void main(String[] args) {
        // 1. Operațiuni uniforme pe liste:
        List limbaje = new ArrayList<>(List.of("Java", "Go", "Rust"));

        limbaje.addFirst("C++");  // Adaugă la început
        limbaje.addLast("Python"); // Adaugă la sfârșit

        System.out.println("Primul element: " + limbaje.getFirst()); // "C++"
        System.out.println("Ultimul element: " + limbaje.getLast()); // "Python"

        // 2. Vizualizare inversată în timp O(1) fără copiere de date:
        List inversat = limbaje.reversed();
        System.out.println("Listă inversată: " + inversat);

        // 3. SequencedMap pentru dicționare ordonate:
        var map = new LinkedHashMap();
        map.put("Unu", 1);
        map.put("Doi", 2);
        map.put("Trei", 3);

        System.out.println("Prima intrare din dicționar: " + map.firstEntry());
        System.out.println("Ultima intrare din dicționar: " + map.lastEntry());

        // Inversarea hărții de parcurgere:
        map.reversed().forEach((k, v) -> System.out.println(k + " => " + v));
    }
}

Ierarhia Interfețelor Sequenced Collections

Interfață Nouă Extinde Implementată Nativ De
SequencedCollection<E> Collection<E> List, Deque, LinkedHashSet
SequencedSet<E> Set<E>, SequencedCollection<E> LinkedHashSet, TreeSet
SequencedMap<K, V> Map<K, V> LinkedHashMap, TreeMap