I have trouble understanding the flow of pipeline design pattern, especially how the chain of steps are executed one after the other?

I am trying to implement pipeline design pattern using reference from : https://java-design-patterns.com/patterns/pipeline/ and https://medium.com/@deepakbapat/the-pipeline-design-pattern-in-java-831d9ce2fe21

I have created example classes as below to debug and understand the flow .When the call jobPipeline.execute(12); in PipelineRunner.class is fired, only first step's method should be executed correct? but how come other steps(second and third steps) are also getting executed one after the other?

Step.class

public interface Step<I, O> {
  O executeStep(I stepData);
}

Pipeline.class

public class Pipeline<I, O> {

  private final Step<I, O> current;

  public Pipeline(Step<I, O> current) {
    this.current = current;
  }

  public <K> Pipeline<I, K> next(Step<O, K> step) {
    return new Pipeline<>(input -> step.executeStep(current.executeStep(input)));
  }

  public O execute(I input) {
    return current.executeStep(input);
  }
}

PipelineRunner.class

public class PipelineRunner {

  public static void main(String[] args) {

    Step<Integer, Integer> firstStep = x->{ System.out.println("First step");
      return 2; };

    Step<Integer, Integer> secondStep = x->{ System.out.println("Second step");
      return 2; };

    Step<Integer, Integer> thirdStep = x->{ System.out.println("Third step");
      return 2; };


    var jobPipeline = new Pipeline<>(firstStep)
        .next(secondStep)
        .next(thirdStep);


     jobPipeline.execute(12); //How rest of steps( second and third step) are executed with this single call on the jobPipeline object?

  }

}

Ouput:

First step
Second step
Third step


Solution 1:

In this line:

step.executeStep(current.executeStep(input))

current.executeStep is executed, and then step.executeStep so its result can be passed in. This is no different from Math.abs(1+2) evaluating 1+2=3 before passing it to Math.abs.