Map.of în Java

Dicționare (Map, HashMap, TreeMap) Java 9 (copyOf: Java 10)

Creează un map nemodificabil din perechi date direct (of, ofEntries) sau copiind alt map (copyOf). Ordinea nu este garantată.

Sintaxă
static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, ...)   // până la 10 perechi
static <K, V> Map<K, V> ofEntries(Map.Entry<? extends K, ? extends V>... entries)
static <K, V> Map<K, V> copyOf(Map<? extends K, ? extends V> map)

Ce face Map.of

Map.of(k1, v1, k2, v2, ...) creează rapid un map fix, cu cel mult 10 perechi. Pentru mai multe perechi folosești Map.ofEntries(Map.entry(k1, v1), Map.entry(k2, v2), ...), fără limită. Cheile duplicate dau IllegalArgumentException, iar null nu este permis nici la chei, nici la valori.

Map.copyOf(altMap) face o copie nemodificabilă; schimbările ulterioare ale originalului nu se văd în copie. Dacă altMap este deja nemodificabil, poate returna chiar același obiect.

Map-urile create astfel aruncă UnsupportedOperationException la put, remove, clear. Ordinea perechilor la parcurgere nu este garantată și se schimbă între rulări: pentru afișare ordonată, copiază în TreeMap.

Parametri

Parametru Descriere
k1, v1, ... Cheile și valorile, alternativ.
entries Perechi create cu Map.entry(k, v).
map Map-ul de copiat.

Ce returnează

Un map nemodificabil.

Exemple

Exemplul 1: Tabel de conversie fix

import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Double> curs = Map.of("EUR", 5.09, "USD", 4.38, "GBP", 5.87);
        double suma = 100;
        System.out.println(suma + " EUR = " + suma * curs.get("EUR") + " lei");
        System.out.println("Monede: " + curs.size());
    }
}

Rezultat

100.0 EUR = 509.0 lei
Monede: 3

Exemplul 2: ofEntries pentru mai multe perechi

Afișăm prin TreeMap, pentru că ordinea unui Map.ofEntries se schimbă de la o rulare la alta.

import java.util.Map;
import java.util.TreeMap;

import static java.util.Map.entry;

public class Main {
    public static void main(String[] args) {
        Map<String, String> judete = Map.ofEntries(
                entry("AB", "Alba"), entry("AR", "Arad"), entry("BV", "Brașov"),
                entry("CJ", "Cluj"), entry("CT", "Constanța"), entry("IS", "Iași"),
                entry("SB", "Sibiu"), entry("SV", "Suceava"), entry("TM", "Timiș"),
                entry("VS", "Vaslui"), entry("B", "București"));
        System.out.println(judete.size() + " județe");
        System.out.println(new TreeMap<>(judete).headMap("C"));
    }
}

Rezultat

11 județe
{AB=Alba, AR=Arad, B=București, BV=Brașov}

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

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> curent = new HashMap<>();
        curent.put("Ana", 9);
        Map<String, Integer> instantaneu = Map.copyOf(curent);
        curent.put("Radu", 7);
        System.out.println("Original: " + curent.size() + " perechi, copie: " + instantaneu.size());
        try {
            instantaneu.put("Elena", 10);
        } catch (UnsupportedOperationException e) {
            System.out.println("Copia nu se poate modifica");
        }
        try {
            Map.of("Ana", 1, "Ana", 2);
        } catch (IllegalArgumentException e) {
            System.out.println("Map.of cu cheie duplicată: IllegalArgumentException");
        }
    }
}

Rezultat

Original: 2 perechi, copie: 1
Copia nu se poate modifica
Map.of cu cheie duplicată: IllegalArgumentException

Greșeli frecvente

  • Afișezi direct un Map.of și aștepți aceeași ordine. Ordinea se schimbă între rulări.
  • Scrii Map.of cu 11 perechi. Nu există o asemenea variantă; folosește Map.ofEntries.
  • Pui o valoare null. Map.of aruncă NullPointerException.

Comenzi înrudite

  • Map: Interfața pentru dicționare: perechi cheie → valoare, în care găsești rapid valoarea după cheie. Cheile sunt unice.
  • Map.entrySet: entrySet() dă perechile cheie-valoare ale unui map, ca obiecte Map.Entry; Map.entry(k, v) creează o astfel de pereche.
  • Set.of: Creează o mulțime nemodificabilă din valorile date (of) sau dintr-o colecție existentă (copyOf). Ordinea nu este garantată.
  • List.of: Creează o listă nemodificabilă din valorile date (of) sau dintr-o copie a altei colecții (copyOf).
  • Map.ofLazy: Map nemodificabil cu chei fixe, a cărui valoare pentru fiecare cheie se calculează abia la prima citire, apoi se păstrează.