List.of în Java

Liste (List, ArrayList, LinkedList) Java 9 (copyOf: Java 10)

Creează o listă nemodificabilă din valorile date (of) sau dintr-o copie a altei colecții (copyOf).

Sintaxă
static <E> List<E> of(E... elemente)
static <E> List<E> copyOf(Collection<? extends E> c)

Ce face List.of

List.of(a, b, c) creează o listă cu exact aceste elemente, în această ordine. Lista este nemodificabilă: add, remove, set, clear aruncă UnsupportedOperationException. Este modul cel mai scurt de a scrie o listă de valori fixe.

List.copyOf(c) face o copie nemodificabilă a colecției c. Dacă c se schimbă mai târziu, copia rămâne la fel. Dacă c este deja o listă nemodificabilă creată cu of/copyOf, Java poate returna chiar aceeași listă, fără copiere.

Niciuna nu acceptă null: un element null aruncă NullPointerException. Ca să obții o listă modificabilă cu valori inițiale, scrie new ArrayList<>(List.of(...)).

Parametri

Parametru Descriere
elemente Valorile listei (zero sau mai multe).
c Colecția copiată (nu poate conține null).

Ce returnează

O listă nemodificabilă.

Exemple

Exemplul 1: Liste de valori fixe

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> anotimpuri = List.of("primăvară", "vară", "toamnă", "iarnă");
        List<Integer> goala = List.of();
        System.out.println(anotimpuri + " are " + anotimpuri.size() + " elemente");
        System.out.println("goala = " + goala);
        try {
            anotimpuri.add("al cincilea");
        } catch (UnsupportedOperationException e) {
            System.out.println("Nu se poate modifica.");
        }
    }
}

Rezultat

[primăvară, vară, toamnă, iarnă] are 4 elemente
goala = []
Nu se poate modifica.

Exemplul 2: copyOf: o copie care nu se mai schimbă

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> inscrisi = new ArrayList<>(List.of("Ana", "Mihai"));
        List<String> listaFinala = List.copyOf(inscrisi);

        inscrisi.add("Ioana");          // după închiderea înscrierilor
        System.out.println("Înscriși acum: " + inscrisi);
        System.out.println("Lista finală:  " + listaFinala);
    }
}

Rezultat

Înscriși acum: [Ana, Mihai, Ioana]
Lista finală:  [Ana, Mihai]

Exemplul 3: List.of nu acceptă null

import java.util.List;

public class Main {
    public static void main(String[] args) {
        try {
            List<String> l = List.of("Ana", null);
            System.out.println(l);
        } catch (NullPointerException e) {
            System.out.println("List.of cu null: NullPointerException");
        }
        List<String> modificabila = new java.util.ArrayList<>(List.of("Ana"));
        modificabila.add(null);
        System.out.println("ArrayList acceptă null: " + modificabila);
    }
}

Rezultat

List.of cu null: NullPointerException
ArrayList acceptă null: [Ana, null]

Greșeli frecvente

  • Primești o listă de la List.of și încerci să o sortezi cu sort: și sortarea o modifică, deci aruncă excepție. Sortează o copie: new ArrayList<>(lista).
  • Crezi că lista nemodificabilă face și elementele nemodificabile. Dacă elementele sunt obiecte modificabile (de exemplu alte liste), ele se pot schimba în continuare.
  • Pui null într-o listă creată cu List.of sau copiezi cu copyOf o listă care conține null.

Comenzi înrudite

  • List: Interfața pentru liste ordonate: elementele au poziții (0, 1, 2…), se pot repeta și se pot citi după index.
  • List.ofLazy: Listă nemodificabilă a cărei valoare de la fiecare poziție se calculează abia la prima citire, apoi se păstrează.
  • Arrays.asList: Returnează o listă de mărime fixă legată de un array: poți citi și schimba elemente cu set, dar nu poți adăuga sau șterge.
  • Collections.unmodifiableList: Returnează o vedere doar-pentru-citire a unei liste: cine o primește nu o poate modifica, dar schimbările originalului se văd.
  • Collections.emptyList: emptyList() returnează o listă goală nemodificabilă; singletonList(x) o listă nemodificabilă cu un singur element.
  • Set.of: Creează o mulțime nemodificabilă din valorile date (of) sau dintr-o colecție existentă (copyOf). Ordinea nu este garantată.
  • Map.of: Creează un map nemodificabil din perechi date direct (of, ofEntries) sau copiind alt map (copyOf). Ordinea nu este garantată.