Optional.filter în Java

Păstrează valoarea din Optional doar dacă îndeplinește o condiție; altfel returnează un Optional gol.

Sintaxă
Optional<T> filter(Predicate<? super T> predicate)

Ce face Optional.filter

o.filter(conditie) returnează același Optional dacă valoarea există și condiția este adevărată, altfel un Optional gol. Pe un Optional gol, condiția nu se apelează.

Este utilă pentru validări în lanț: „ia codul introdus, păstrează-l doar dacă are 6 cifre, transformă-l în număr, altfel folosește o valoare implicită”.

Parametri

Parametru Descriere
predicate Condiția pe care trebuie să o îndeplinească valoarea.

Ce returnează

Un Optional: cu valoarea, dacă trece condiția, altfel gol.

Exemple

Exemplul 1: Validarea unui cod poștal

import java.util.Optional;

public class Main {
    static String verifica(String intrare) {
        return Optional.ofNullable(intrare)
                .map(String::strip)
                .filter(s -> s.matches("\\d{6}"))
                .map(s -> "cod valid: " + s)
                .orElse("cod invalid");
    }

    public static void main(String[] args) {
        System.out.println(verifica(" 700259 "));
        System.out.println(verifica("70025"));
        System.out.println(verifica(null));
    }
}

Rezultat

cod valid: 700259
cod invalid
cod invalid

Exemplul 2: Doar majorii

import java.util.Optional;

public class Main {
    record Persoana(String nume, int varsta) {}

    public static void main(String[] args) {
        Optional<Persoana> ana = Optional.of(new Persoana("Ana", 19));
        Optional<Persoana> radu = Optional.of(new Persoana("Radu", 15));
        System.out.println(ana.filter(p -> p.varsta() >= 18).map(Persoana::nume).orElse("minor"));
        System.out.println(radu.filter(p -> p.varsta() >= 18).map(Persoana::nume).orElse("minor"));
    }
}

Rezultat

Ana
minor

Greșeli frecvente

  • Crezi că filter pe Optional parcurge mai multe elemente. Un Optional are cel mult o valoare; pentru liste folosește stream().filter.

Comenzi înrudite

  • 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: 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.
  • Stream.filter: Păstrează în stream doar elementele care îndeplinesc o condiție.
  • Optional.orElse: orElse returnează valoarea sau o rezervă dată; orElseGet calculează rezerva cu o funcție, doar când e nevoie.