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
peekpentru a modifica date sau a adăuga în altă listă. Nu este garantat că rulează pentru toate elementele; foloseștemapsauforEach. - Aștepți ca
peeksă 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.