Ce face Optional.ifPresent
o.ifPresent(v -> ...) apelează lambda cu valoarea, dacă există; dacă Optional-ul e gol, nu face nimic. Înlocuiește tiparul if (o.isPresent()) { ... o.get() ... }.
o.ifPresentOrElse(v -> ..., () -> ...) primește două acțiuni: prima pentru valoare, a doua (fără argumente) pentru cazul gol. Ambele metode nu returnează nimic; dacă vrei un rezultat, folosește map(...).orElse(...).
Parametri
| Parametru | Descriere |
|---|---|
action |
Ce se face cu valoarea. |
emptyAction |
Ce se face dacă nu există valoare. |
Ce returnează
Nimic (void).
Exemple
Exemplul 1: Mesaj doar dacă există reducere
import java.util.Map;
import java.util.Optional;
public class Main {
public static void main(String[] args) {
Map<String, Integer> reduceri = Map.of("cafea", 10, "ceai", 25);
for (String produs : new String[] {"cafea", "lapte"}) {
Optional.ofNullable(reduceri.get(produs))
.ifPresent(r -> System.out.println(produs + ": reducere " + r + "%"));
}
System.out.println("gata");
}
}
Rezultat
cafea: reducere 10%
gata
Exemplul 2: Ambele cazuri cu ifPresentOrElse
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> zboruri = List.of("RO301 București", "W6 3021 Cluj", "RO705 Iași");
for (String oras : new String[] {"Iași", "Sibiu"}) {
zboruri.stream()
.filter(z -> z.endsWith(oras))
.findFirst()
.ifPresentOrElse(
z -> System.out.println(oras + ": zborul " + z.substring(0, z.lastIndexOf(' '))),
() -> System.out.println(oras + ": niciun zbor azi"));
}
}
}
Rezultat
Iași: zborul RO705
Sibiu: niciun zbor azi
Greșeli frecvente
- Încerci să returnezi o valoare din lambda lui
ifPresent. Metoda returneazăvoid; foloseștemapșiorElse. - Modifici o variabilă locală din lambda (
gasit = true). Compilatorul refuză: variabilele locale folosite în lambda trebuie să fie efectiv finale.
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.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.Optional.orElse: orElse returnează valoarea sau o rezervă dată; orElseGet calculează rezerva cu o funcție, doar când e nevoie.