Optional.isPresent în Java

Comparator și Optional Java 8 (isEmpty: Java 11)

isPresent() spune dacă Optional-ul conține o valoare, isEmpty() dacă e gol; get() returnează valoarea sau aruncă excepție.

Sintaxă
boolean isPresent()
boolean isEmpty()
T get()

Ce face Optional.isPresent

isPresent() returnează true dacă există valoare, iar isEmpty() (din Java 11) este opusul. get() returnează valoarea, dar pe un Optional gol aruncă NoSuchElementException.

Combinația if (o.isPresent()) { ... o.get() ... } funcționează, dar seamănă cu verificarea de null pe care Optional încearcă să o înlocuiască. De obicei e mai clar cu ifPresent, orElse sau map. get() face același lucru ca orElseThrow(), iar acesta din urmă are un nume mai clar.

Ce returnează

isPresent/isEmpty: boolean. get: valoarea.

Exemple

Exemplul 1: Verificare și citire

import java.util.List;
import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        List<Integer> note = List.of(7, 9, 4, 10);
        Optional<Integer> primaRestanta = note.stream().filter(n -> n < 5).findFirst();
        Optional<Integer> primaSub3 = note.stream().filter(n -> n < 3).findFirst();
        System.out.println(primaRestanta.isPresent() + " " + primaRestanta.isEmpty());
        System.out.println(primaSub3.isPresent() + " " + primaSub3.isEmpty());
        if (primaRestanta.isPresent()) {
            System.out.println("Prima notă sub 5: " + primaRestanta.get());
        }
    }
}

Rezultat

true false
false true
Prima notă sub 5: 4

Exemplul 2: get() pe un Optional gol

import java.util.NoSuchElementException;
import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> gol = Optional.empty();
        try {
            System.out.println(gol.get());
        } catch (NoSuchElementException e) {
            System.out.println("get pe gol: " + e.getMessage());
        }
    }
}

Rezultat

get pe gol: No value present

Greșeli frecvente

  • Apelezi get() fără isPresent(). Pe gol aruncă excepție.
  • Scrii if (o.isPresent()) return o.get(); else return "x";. Este exact o.orElse("x").

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.ifPresent: ifPresent execută o acțiune doar dacă există valoare; ifPresentOrElse are și o acțiune separată pentru cazul gol.
  • Optional.orElse: orElse returnează valoarea sau o rezervă dată; orElseGet calculează rezerva cu o funcție, doar când e nevoie.
  • Optional.orElseThrow: Returnează valoarea sau, dacă Optional-ul e gol, aruncă o excepție: NoSuchElementException sau excepția creată de tine.