Map.ofLazy în Java

Dicționare (Map, HashMap, TreeMap) JDK 27 (API în previzualizare)

Map nemodificabil cu chei fixe, a cărui valoare pentru fiecare cheie se calculează abia la prima citire, apoi se păstrează.

Sintaxă
static <K, V> Map<K, V> ofLazy(Set<? extends K> chei, Function<? super K, ? extends V> calcul)

Ce face Map.ofLazy

Map.ofLazy(chei, calcul) creează un map care are exact cheile date, dar nu calculează nicio valoare la creare. Prima dată când citești o cheie cu get, Java apelează calcul.apply(cheie) și păstrează rezultatul; citirile următoare îl returnează direct. Pentru o cheie care nu este în mulțime, get returnează null fără să apeleze funcția.

Este util pentru configurări sau resurse scumpe, de care programul poate să nu aibă nevoie pe toate. Map-ul este nemodificabil și sigur între fire de execuție (fiecare valoare se calculează o singură dată). Funcția nu are voie să returneze null.

Atenție: în JDK 27 metoda face parte dintr-un API în previzualizare (preview, „lazy constants”). Se compilează și rulează doar cu --enable-preview (javac --release 27 --enable-preview Main.java, apoi java --enable-preview Main) și se poate schimba în versiunile următoare. Rezultatele de mai jos sunt dintr-o rulare reală cu aceste opțiuni.

Parametri

Parametru Descriere
chei Mulțimea cheilor map-ului.
calcul Funcția care primește cheia și returnează valoarea (fără null).

Ce returnează

Un map nemodificabil cu valori calculate la cerere.

Exemple

Exemplul 1: Valorile se calculează doar când sunt cerute

„calc Cluj” apare o singură dată; „Brașov” nu este cheie, deci rezultatul e null fără calcul. Copierea în TreeMap calculează cheia rămasă.

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        Set<String> orase = new TreeSet<>(Set.of("Iași", "Cluj"));
        Map<String, Integer> lungimi = Map.ofLazy(orase, k -> {
            System.out.println("calc " + k);
            return k.length();
        });
        System.out.println("map creat");
        System.out.println(lungimi.get("Cluj"));
        System.out.println(lungimi.get("Cluj"));
        System.out.println(lungimi.get("Brașov"));
        System.out.println(new TreeMap<>(lungimi));
    }
}

Rezultat (rulat cu –enable-preview)

map creat
calc Cluj
4
4
null
calc Iași
{Cluj=4, Iași=4}

Greșeli frecvente

  • Compilezi fără --enable-preview. javac refuză, pentru că ofLazy este un API în previzualizare.
  • Încerci put pentru o cheie nouă. Map-ul este nemodificabil; cheile se stabilesc la creare.
  • Returnezi null din funcția de calcul. Citirea acelei chei aruncă NullPointerException.

Comenzi înrudite

  • Map.of: Creează un map nemodificabil din perechi date direct (of, ofEntries) sau copiind alt map (copyOf). Ordinea nu este garantată.
  • List.ofLazy: Listă nemodificabilă a cărei valoare de la fiecare poziție se calculează abia la prima citire, apoi se păstrează.
  • Set.ofLazy: Mulțime nemodificabilă formată din candidații care îndeplinesc o condiție; condiția se calculează abia când întrebi de un element.
  • Map.computeIfAbsent: Dacă cheia lipsește, calculează valoarea cu funcția dată și o pune în map. Returnează valoarea (nouă sau existentă). Ideal pentru grupări.