Optional.stream în Java

Transformă un Optional într-un Stream cu un element (dacă e plin) sau fără elemente (dacă e gol).

Sintaxă
Stream<T> stream()

Ce face Optional.stream

o.stream() returnează un stream cu exact un element, dacă o are valoare, sau un stream gol. Pare puțin util singur, dar este foarte practic împreună cu flatMap pe stream-uri: dintr-o listă de Optional-uri păstrezi doar valorile prezente, fără verificări.

Tiparul tipic: lista.stream().map(this::cauta).flatMap(Optional::stream).toList(): caută fiecare element și păstrează doar rezultatele găsite.

Ce returnează

Un Stream<T> cu 0 sau 1 elemente.

Exemple

Exemplul 1: Doar codurile valide dintr-o listă

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

public class Main {
    static Optional<Integer> numar(String s) {
        try {
            return Optional.of(Integer.parseInt(s.strip()));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }

    public static void main(String[] args) {
        List<String> intrari = List.of("12", "abc", " 7", "", "30");
        List<Integer> valide = intrari.stream()
                .map(Main::numar)
                .flatMap(Optional::stream)
                .toList();
        System.out.println(valide);
    }
}

Rezultat

[12, 7, 30]

Exemplul 2: Numărul de elemente

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        System.out.println(Optional.of("Iași").stream().count());
        System.out.println(Optional.empty().stream().count());
    }
}

Rezultat

1
0

Greșeli frecvente

  • Scrii .filter(Optional::isPresent).map(Optional::get). Merge, dar .flatMap(Optional::stream) e mai scurt și mai sigur.

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.
  • Stream.flatMap: Transformă fiecare element într-un stream și lipește toate aceste stream-uri într-unul singur.
  • Collection.stream: Creează un Stream peste elementele colecției, ca să le filtrezi, transformi, sortezi sau aduni într-un rezultat.
  • 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.