Search code examples
javajava-8java-streamchaining

Java 8 apply function to all elements of Stream without breaking stream chain


Is there a way in Java to apply a function to all the elements of a Stream without breaking the Stream chain? I know I can call forEach, but that method returns a void, not a Stream.


Solution

  • There are (at least) 3 ways. For the sake of example code, I've assumed you want to call 2 consumer methods methodA and methodB:

    A. Use peek():

    list.stream().peek(x -> methodA(x)).forEach(x -> methodB(x));
    

    Although the docs say only use it for "debug", it works (and it's in production right now)

    B. Use map() to call methodA, then return the element back to the stream:

    list.stream().map(x -> {method1(x); return x;}).forEach(x -> methodB(x));
    

    This is probably the most "acceptable" approach.

    C. Do two things in the forEach():

    list.stream().forEach(x -> {method1(x); methodB(x);});
    

    This is the least flexible and may not suit your need.