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.