Optional.ifPresent în Java

Comparator și Optional Java 8 (ifPresentOrElse: Java 9)

ifPresent execută o acțiune doar dacă există valoare; ifPresentOrElse are și o acțiune separată pentru cazul gol.

Sintaxă
void ifPresent(Consumer<? super T> action)
void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

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ște map și orElse.
  • 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.