Java streams lazy vs fusion vs short-circuiting

后端 未结 1 1712
轻奢々
轻奢々 2020-11-30 07:10

I\'m trying to form a cocise and conherent understanding of the application of lazy evaluation within the Java streams API.

Here is what I currently understand:

相关标签:
1条回答
  • 2020-11-30 07:44

    As for fusion. Let's imagine here's a map operation:

    .map(x -> x.squash())
    

    Map

    It's stateless and it just transforms any input according to the specified algorithm (in our case squashes them). Now the filter operation:

    .filter(x -> x.getColor() != YELLOW)
    

    Filter

    It's also stateless and it just removes some elements (in our case yellow ones). Now let's have a terminal operation:

    .forEach(System.out::println)
    

    Display

    It just displays the input elements to the terminal. The fusion means that all intermediate stateless operations are merged with terminal consumer into single operation:

    .map(x -> x.squash())
    .filter(x -> x.getColor() != YELLOW)
    .forEach(System.out::println)
    

    Fuse

    The whole pipeline is fused into single Consumer which is connected directly to the source. When every single element is processed, the source spliterator just executes the combined consumer, the stream pipeline does not intercept anything and does not perform any additional bookkeeping. That's fusion. Fusion does not depend on short-circuiting. It's possible to implement streams without fusion (execute one operation, take the result, execute the next operation, taking the control after each operation back to the stream engine). It's also possible to have fusion without short-circuiting.

    0 讨论(0)
提交回复
热议问题