Optional.of în Java

of(x) creează un Optional cu o valoare sigur prezentă, ofNullable(x) unul care e gol dacă x este null, empty() unul gol.

Sintaxă
static <T> Optional<T> of(T value)           // valoarea nu are voie să fie null
static <T> Optional<T> ofNullable(T value)   // null devine Optional gol
static <T> Optional<T> empty()

Ce face Optional.of

Optional.of(x) învelește o valoare despre care știi că nu este null; dacă totuși e null, aruncă imediat NullPointerException, ceea ce te ajută să prinzi greșeala devreme.

Optional.ofNullable(x) este puntea dintre codul vechi, care returnează null, și Optional: dacă x este null, primești un Optional gol. Optional.empty() returnează direct un Optional gol, pentru cazul „nu am găsit”.

Parametri

Parametru Descriere
value Valoarea învelită.

Ce returnează

Un Optional plin sau gol.

Exemple

Exemplul 1: Cele trei moduri de a crea un Optional

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> a = Optional.of("Iași");
        Optional<String> b = Optional.ofNullable(null);
        Optional<String> c = Optional.empty();
        System.out.println(a + " " + b + " " + c);
        try {
            Optional.of(null);
        } catch (NullPointerException e) {
            System.out.println("Optional.of(null): NullPointerException");
        }
    }
}

Rezultat

Optional[Iași] Optional.empty Optional.empty
Optional.of(null): NullPointerException

Exemplul 2: O metodă de căutare care returnează Optional

import java.util.List;
import java.util.Optional;

public class Main {
    record Produs(String cod, String nume, double pret) {}

    static final List<Produs> catalog = List.of(
            new Produs("P1", "cafea", 24.5), new Produs("P2", "ceai", 9.9));

    static Optional<Produs> dupaCod(String cod) {
        for (Produs p : catalog) {
            if (p.cod().equals(cod)) {
                return Optional.of(p);
            }
        }
        return Optional.empty();
    }

    public static void main(String[] args) {
        System.out.println(dupaCod("P2").map(Produs::nume).orElse("inexistent"));
        System.out.println(dupaCod("P9").map(Produs::nume).orElse("inexistent"));
    }
}

Rezultat

ceai
inexistent

Greșeli frecvente

  • Folosești Optional.of pe o valoare care poate fi null (de exemplu rezultatul lui map.get). Folosește ofNullable.
  • Scrii return null; într-o metodă care returnează Optional. Scrie return Optional.empty();.

Comenzi înrudite

  • Optional: O „cutie” care conține o valoare sau este goală. Arată clar că un rezultat poate lipsi și te obligă să tratezi cazul, în loc de null.
  • Optional.isPresent: isPresent() spune dacă Optional-ul conține o valoare, isEmpty() dacă e gol; get() returnează valoarea sau aruncă excepție.
  • Optional.orElse: orElse returnează valoarea sau o rezervă dată; orElseGet calculează rezerva cu o funcție, doar când e nevoie.
  • Optional.equals: Două Optional-uri sunt egale dacă ambele sunt goale sau au valori egale; toString afișează Optional[valoare] sau Optional.empty.