Ce face Optional.or
o.or(() -> altOptional) returnează o dacă are valoare; altfel apelează funcția și returnează Optional-ul dat de ea. Spre deosebire de orElse, rezultatul rămâne un Optional, deci poți continua lanțul cu încă un or, cu map sau cu orElse la final.
Funcția se apelează doar când e nevoie, ca la orElseGet. Este potrivită pentru „caută în cache, apoi în fișier, apoi în setările implicite”.
Parametri
| Parametru | Descriere |
|---|---|
supplier |
Funcția care produce Optional-ul de rezervă. |
Ce returnează
Același Optional (dacă e plin) sau cel produs de funcție.
Exemple
Exemplul 1: Telefonul de contact: mobil, apoi fix, apoi recepția
import java.util.Map;
import java.util.Optional;
public class Main {
static final Map<String, String> mobil = Map.of("Ana", "0722 111 222");
static final Map<String, String> fix = Map.of("Radu", "0232 123 456");
static String contact(String nume) {
return Optional.ofNullable(mobil.get(nume))
.or(() -> Optional.ofNullable(fix.get(nume)))
.orElse("recepția: 0232 000 000");
}
public static void main(String[] args) {
for (String n : new String[] {"Ana", "Radu", "Elena"}) {
System.out.println(n + ": " + contact(n));
}
}
}
Rezultat
Ana: 0722 111 222
Radu: 0232 123 456
Elena: recepția: 0232 000 000
Exemplul 2: Funcția de rezervă se apelează doar la nevoie
import java.util.Optional;
public class Main {
static Optional<String> dinFisier() {
System.out.println("(citesc din fișier)");
return Optional.of("ro");
}
public static void main(String[] args) {
System.out.println(Optional.of("en").or(Main::dinFisier).orElseThrow());
System.out.println(Optional.<String>empty().or(Main::dinFisier).orElseThrow());
}
}
Rezultat
en
(citesc din fișier)
ro
Greșeli frecvente
- Folosești
orcu o valoare simplă:or(() -> "x"). Funcția trebuie să returneze unOptional; pentru o valoare simplă foloseșteorElse/orElseGet.
Comenzi înrudite
Optional.orElse: orElse returnează valoarea sau o rezervă dată; orElseGet calculează rezerva cu o funcție, doar când e nevoie.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.map: map transformă valoarea din Optional (dacă există) și o pune într-un Optional nou; flatMap face la fel pentru funcții care returnează deja Optional.