Optional.or în Java

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ă.

Sintaxă
Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

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 or cu o valoare simplă: or(() -> "x"). Funcția trebuie să returneze un Optional; pentru o valoare simplă folosește orElse/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.