Logging inside Java Stream

Background

Once upon a time, I wanted to log something that was executed inside the Java stream for debugging purposes.

But, I didn't see anything logged there.

Solution

Put the log inside the peek() method instead of map().

Example

Previously, I was logging in this way (which didn't work),

Stream.of("one", "two", "three", "four")
         .filter(e -> e.length() > 3)
         .peek(e -> System.out.println("Filtered value: " + e))
         .map(String::toUpperCase)
         .peek(e -> System.out.println("Mapped value: " + e))
         .collect(Collectors.toList());

Stream.of("one", "two", "three", "four")
    .map(val -> {
        System.out.println("Value length: " + val.length();
        return val;
    })  
    .filter(val -> val.length() > 3)
    .collect(Collectors.toList());

To make it works, I moved the logging to peek() ,

Stream.of("one", "two", "three", "four")
    .peek(val -> System.out.println("Value length: " + val.length()))    
    .filter(val -> val.length() > 3)
    .collect(Collectors.toList());