Stream.peek în Java

Rulează o acțiune pentru fiecare element care trece, fără să-l schimbe; folosit mai ales pentru depanare.

Sintaxă
Stream<T> peek(Consumer<? super T> actiune)

Ce face Stream.peek

peek(actiune) „trage cu ochiul” la elementele care trec prin acel loc al stream-ului: apelează acțiunea (de obicei o afișare) și lasă elementul să meargă mai departe neschimbat.

Este o unealtă de depanare: arată ce se întâmplă între etape și în ce ordine sunt prelucrate elementele. Nu te baza pe el pentru logica programului: dacă operația finală nu are nevoie de toate elementele (findFirst, limit, sau chiar count pe o listă de mărime cunoscută), peek poate să nu ruleze deloc pentru unele elemente.

Parametri

Parametru Descriere
actiune Un Consumer apelat pentru fiecare element care trece.

Ce returnează

Același stream (aceleași elemente).

Exemple

Exemplul 1: Cum trece fiecare element prin etape

Elementele nu trec întâi toate prin filter și apoi toate prin map: fiecare element parcurge tot drumul, unul după altul.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> rezultat = List.of("ana", "dan", "ioana").stream()
                .peek(n -> System.out.println("intră:    " + n))
                .filter(n -> n.length() > 3)
                .peek(n -> System.out.println("filtrat:  " + n))
                .map(String::toUpperCase)
                .toList();
        System.out.println(rezultat);
    }
}

Rezultat

intră:    ana
intră:    dan
intră:    ioana
filtrat:  ioana
[IOANA]

Exemplul 2: peek nu rulează pentru elementele care nu sunt necesare

findFirst se oprește la primul număr par, deci restul elementelor nu ajung niciodată la peek.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        int primulPar = Stream.of(3, 5, 8, 11, 12)
                .peek(n -> System.out.println("verific " + n))
                .filter(n -> n % 2 == 0)
                .findFirst()
                .orElse(-1);
        System.out.println("Primul par: " + primulPar);
    }
}

Rezultat

verific 3
verific 5
verific 8
Primul par: 8

Greșeli frecvente

  • Folosești peek pentru a modifica date sau a adăuga în altă listă. Nu este garantat că rulează pentru toate elementele; folosește map sau forEach.
  • Aștepți ca peek să afișeze ceva fără o operație finală. Ca toate operațiile intermediare, nu rulează până nu apare una.

Comenzi înrudite

  • Stream.forEach: Rulează o acțiune (de obicei o afișare) pentru fiecare element; forEachOrdered păstrează ordinea și la stream-uri paralele.
  • Stream: Un șir de valori prelucrate pas cu pas: filtrezi, transformi, sortezi și aduni rezultatul, fără bucle scrise de mână.
  • Consumer: O acțiune care primește o valoare și nu returnează nimic (afișează, salvează, trimite); o rulezi cu accept.
  • Stream.map: Transformă fiecare element al stream-ului în altă valoare, eventual de alt tip.