Collection.stream în Java

Creează un Stream peste elementele colecției, ca să le filtrezi, transformi, sortezi sau aduni într-un rezultat.

Sintaxă
default Stream<E> stream()
default Stream<E> parallelStream()

Ce face Collection.stream

stream() transformă orice colecție (listă, mulțime, coadă) într-un Stream: un „flux” de elemente pe care îl prelucrezi în pași: filter (păstrează doar unele), map (transformă), sorted, apoi o operație finală ca toList(), count() sau collect(...).

Stream-ul nu modifică colecția inițială: rezultatul este o colecție sau o valoare nouă. Un stream se poate folosi o singură dată; pentru o nouă prelucrare apelezi din nou stream().

parallelStream() poate împărți munca pe mai multe nuclee. Merită doar pentru colecții foarte mari și calcule grele; pentru programe obișnuite folosește stream().

Ce returnează

Un Stream<E> secvențial (sau paralel, pentru parallelStream).

Exemple

Exemplul 1: Filtrarea și transformarea unei liste

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> orase = List.of("Iași", "Cluj", "București", "Arad", "Constanța");
        List<String> lungi = orase.stream()
                .filter(o -> o.length() > 4)
                .map(String::toUpperCase)
                .sorted()
                .toList();
        System.out.println(lungi);
        System.out.println("Lista inițială: " + orase);
    }
}

Rezultat

[BUCUREȘTI, CONSTANȚA]
Lista inițială: [Iași, Cluj, București, Arad, Constanța]

Exemplul 2: Suma și media prețurilor dintr-o mulțime

import java.util.List;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        TreeSet<Integer> preturi = new TreeSet<>(List.of(15, 40, 25, 40));
        int total = preturi.stream().mapToInt(Integer::intValue).sum();
        double medie = preturi.stream().mapToInt(Integer::intValue).average().orElse(0);
        long scumpe = preturi.stream().filter(p -> p >= 25).count();
        System.out.println("Prețuri distincte: " + preturi);
        System.out.println("Total: " + total + " lei, medie: " + medie);
        System.out.println("Produse de cel puțin 25 lei: " + scumpe);
    }
}

Rezultat

Prețuri distincte: [15, 25, 40]
Total: 80 lei, medie: 26.666666666666668
Produse de cel puțin 25 lei: 2

Greșeli frecvente

  • Refolosești același obiect Stream de două ori. A doua operație aruncă IllegalStateException; apelează colectie.stream() din nou.
  • Crezi că filter șterge elemente din colecție. Colecția rămâne neschimbată; pentru ștergere folosește removeIf.
  • Folosești parallelStream() peste tot „ca să fie mai rapid”. Pentru colecții mici este de obicei mai lent.

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.filter: Păstrează în stream doar elementele care îndeplinesc o condiție.
  • Stream.map: Transformă fiecare element al stream-ului în altă valoare, eventual de alt tip.
  • Collection.removeIf: Șterge din colecție toate elementele pentru care condiția dată este adevărată. Returnează true dacă s-a șters ceva.
  • Arrays.stream: Creează un stream din elementele unui array, ca să le filtrezi, transformi sau aduni (sum, average, max) cu o singură expresie.
  • Optional.stream: Transformă un Optional într-un Stream cu un element (dacă e plin) sau fără elemente (dacă e gol).