Optional.orElse în Java

orElse returnează valoarea sau o rezervă dată; orElseGet calculează rezerva cu o funcție, doar când e nevoie.

Sintaxă
T orElse(T other)
T orElseGet(Supplier<? extends T> supplier)

Ce face Optional.orElse

o.orElse(rezerva) returnează valoarea, dacă există, altfel rezerva. Atenție: argumentul este calculat întotdeauna, chiar dacă valoarea există, pentru că Java evaluează argumentele înainte de apel.

o.orElseGet(() -> ...) primește o funcție și o apelează doar dacă Optional-ul e gol. Folosește-o când rezerva este costisitoare: o citire din bază de date, un calcul lung, crearea unui obiect mare. Pentru constante simple, orElse e suficient.

Parametri

Parametru Descriere
other Valoarea de rezervă.
supplier Funcția care produce rezerva.

Ce returnează

Valoarea din Optional sau rezerva.

Exemple

Exemplul 1: Nume afișat, cu rezervă

import java.util.Optional;

public class Main {
    static Optional<String> porecla(String utilizator) {
        return utilizator.equals("ana92") ? Optional.of("Ani") : Optional.empty();
    }

    public static void main(String[] args) {
        System.out.println("Salut, " + porecla("ana92").orElse("vizitator") + "!");
        System.out.println("Salut, " + porecla("radu_m").orElse("vizitator") + "!");
    }
}

Rezultat

Salut, Ani!
Salut, vizitator!

Exemplul 2: orElse calculează mereu, orElseGet doar la nevoie

Mesajul „încarc din baza de date” apare la orElse chiar dacă valoarea există; la orElseGet nu apare.

import java.util.Optional;

public class Main {
    static String dinBazaDeDate() {
        System.out.println("  (încarc din baza de date...)");
        return "setare implicită";
    }

    public static void main(String[] args) {
        Optional<String> dinCache = Optional.of("temă întunecată");
        System.out.println("orElse:");
        System.out.println("  " + dinCache.orElse(dinBazaDeDate()));
        System.out.println("orElseGet:");
        System.out.println("  " + dinCache.orElseGet(Main::dinBazaDeDate));
        System.out.println("orElseGet pe gol:");
        System.out.println("  " + Optional.<String>empty().orElseGet(Main::dinBazaDeDate));
    }
}

Rezultat

orElse:
  (încarc din baza de date...)
  temă întunecată
orElseGet:
  temă întunecată
orElseGet pe gol:
  (încarc din baza de date...)
  setare implicită

Greșeli frecvente

  • Pui în orElse un apel costisitor sau cu efecte (scriere în fișier, cerere în rețea). Se execută mereu; folosește orElseGet.
  • Scrii orElse(null) și apoi folosești rezultatul fără verificare. Ai readus problema lui null.

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.orElseThrow: Returnează valoarea sau, dacă Optional-ul e gol, aruncă o excepție: NoSuchElementException sau excepția creată de tine.
  • Optional.or: Dacă Optional-ul e gol, încearcă o altă sursă care returnează tot un Optional. Util pentru căutări cu mai multe variante de rezervă.
  • Map.get: get returnează valoarea unei chei sau null dacă lipsește; getOrDefault returnează o valoare de rezervă în loc de null.