Stream.of în Java

Crearea stream-urilor Java 8 (ofNullable: Java 9)

Creează un stream direct din câteva valori; ofNullable face un stream gol pentru null, iar empty un stream fără elemente.

Sintaxă
static <T> Stream<T> of(T... valori)
static <T> Stream<T> of(T valoare)
static <T> Stream<T> ofNullable(T valoare)
static <T> Stream<T> empty()

Ce face Stream.of

Stream.of(a, b, c) creează un stream din valorile date, în ordinea în care le scrii. Este cel mai scurt mod de a începe un stream când nu ai deja o colecție. Poți da și un tablou: Stream.of(tablou).

Stream.ofNullable(x) creează un stream cu un singur element dacă x nu este null și un stream gol dacă este. Este util în flatMap, ca să sari peste valorile lipsă.

Stream.empty() returnează un stream fără niciun element. Îl folosești când o metodă trebuie să returneze un stream, dar nu are nimic de dat (mai bine decât null).

Parametri

Parametru Descriere
valori Elementele stream-ului, separate prin virgulă, sau un tablou de tip T[].
valoare Pentru ofNullable: o valoare care poate fi null.

Ce returnează

Un Stream<T> secvențial și ordonat cu elementele date (gol pentru empty() sau ofNullable(null)).

Exemple

Exemplul 1: Stream din valori și din tablou

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream.of("Ana", "Mihai", "Elena")
                .map(n -> "Salut, " + n + "!")
                .forEach(System.out::println);

        String[] judete = {"Iași", "Cluj", "Dolj"};
        System.out.println(Stream.of(judete).toList());
        System.out.println(Stream.of(42).toList());
    }
}

Rezultat

Salut, Ana!
Salut, Mihai!
Salut, Elena!
[Iași, Cluj, Dolj]
[42]

Exemplul 2: ofNullable: sari peste valorile lipsă

Unii studenți nu au e-mail (null). Cu flatMap(Stream::ofNullable) rămân doar adresele existente.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        List<String> emailuri = Arrays.asList("ana@exemplu.ro", null, "radu@exemplu.ro", null);

        List<String> existente = emailuri.stream()
                .flatMap(Stream::ofNullable)
                .toList();
        System.out.println(existente);

        System.out.println(Stream.ofNullable(null).count());
        System.out.println(Stream.ofNullable("Cluj").count());
    }
}

Rezultat

[ana@exemplu.ro, radu@exemplu.ro]
0
1

Exemplul 3: empty: o metodă care nu returnează null

Metoda cursuri returnează un stream gol pentru un student necunoscut. Codul care o apelează funcționează la fel în ambele cazuri.

import java.util.stream.Stream;

public class Main {
    static Stream<String> cursuri(String student) {
        if (student.equals("Ana")) {
            return Stream.of("Matematică", "Informatică");
        }
        return Stream.empty();
    }

    public static void main(String[] args) {
        System.out.println("Ana: " + cursuri("Ana").toList());
        System.out.println("Dan: " + cursuri("Dan").toList());
        System.out.println("Câte pentru Dan: " + cursuri("Dan").count());
    }
}

Rezultat

Ana: [Matematică, Informatică]
Dan: []
Câte pentru Dan: 0

Greșeli frecvente

  • Scrii Stream.of(tablouDeInt) cu un int[]. Obții un Stream<int[]> cu un singur element (tabloul întreg). Pentru tablouri de numere primitive folosește IntStream.of(...) sau Arrays.stream(...).
  • Folosești Stream.of(x) când x poate fi null. Stream-ul va conține elementul null și vei primi NullPointerException mai târziu. Folosește Stream.ofNullable(x).

Comenzi înrudite

  • Stream: Un șir de valori prelucrate pas cu pas: filtrezi, transformi, sortezi și aduni rezultatul, fără bucle scrise de mână.
  • Stream.builder: Construiește un stream element cu element, cu add(), și îl închide cu build().
  • Stream.concat: Lipește două stream-uri: întâi toate elementele primului, apoi pe ale celui de-al doilea.
  • Stream.iterate: Creează un stream din formule: iterate pornește de la o valoare și aplică un pas, generate cere fiecare valoare unui Supplier.
  • IntStream.range: Creează șirul de numere întregi dintre două limite: range fără ultima valoare, rangeClosed cu ea inclusă.
  • Stream.flatMap: Transformă fiecare element într-un stream și lipește toate aceste stream-uri într-unul singur.