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
orElseun apel costisitor sau cu efecte (scriere în fișier, cerere în rețea). Se execută mereu; foloseșteorElseGet. - Scrii
orElse(null)și apoi folosești rezultatul fără verificare. Ai readus problema luinull.
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.