2016-02-12 17 views
5

A volte sarebbe utile fare "qualcosa" (ad es. Stampare) con ogni elemento in un flusso tra le fasi di elaborazione del flusso, ad es. per il debug.Java stream "forEach" ma che non consuma stream

Un semplice esempio potrebbe assomigliare a questo, purtroppo questo non funziona come forEach consuma il torrente:

List<String> list = new ArrayList<>(); 
list.add("one"); 
list.add("two"); 
list.add("three"); 
list.add("four"); 

List<String> filteredList = 
     list.stream() 
     .filter(s -> s.startsWith("t")) 
     .forEach(System.out::println) 
     .collect(Collectors.toList()); 

Come può essere raggiunto?

+0

Eventuali duplicati di [Java 8 Lambda flusso forEach con più istruzioni] (http://stackoverflow.com/questions/31130457/java-8-lambda-stream-foreach-with-multiple-statements) –

+1

@ DidierL Questo duplicato non è un buon esempio dato che _mutates_ l'elemento Stream all'interno dell'operazione 'peek'. – Tunaki

+0

@Tunaki Immagino che uno che muta si adatti anche quando non si ha realmente bisogno di mutare. La risposta è davvero la stessa. Mi sembra che tutte queste domande relative a "sbirciare" siano quasi sempre le stesse. –

risposta

11

Stai cercando l'operazione peek:

Questo metodo esiste principalmente per supportare il debug, in cui si desidera visualizzare gli elementi mentre fluiscono oltre un certo punto in una pipeline

Questo il metodo eseguirà l'azione specificata su tutti gli elementi della pipeline Stream man mano che vengono consumati. Come tale, consente di prendere uno peek degli elementi.

List<String> filteredList = 
    list.stream() 
     .filter(s -> s.startsWith("t")) 
     .peek(System.out::println) 
     .collect(Collectors.toList());