Search code examples
javajava-8java-streamshort-circuiting

Is the skip() method a short circuiting-operation?


I am reading about Java streams' short-circuiting operations and found in some articles that skip() is a short-circuiting operation.

In another article they didn't mention skip() as a short-circuiting operation.

Now I am confused; is skip() a short-circuiting operation or not?


Solution

  • From the java doc under the "Stream operations and pipelines" section :

    An intermediate operation is short-circuiting if, when presented with infinite input, it may produce a finite stream as a result. A terminal operation is short-circuiting if, when presented with infinite input, it may terminate in finite time.

    Emphasis mine.

    if you were to call skip on an infinite input it won't produce a finite stream hence not a short-circuiting operation.

    The only short-circuiting intermediate operation in JDK8 is limit as it allows computations on infinite streams to complete in finite time.

    Example:

    if you were to execute this program with the use of skip:

    String[] skip = Stream.generate(() -> "test") // returns an infinite stream
                          .skip(20) 
                          .toArray(String[]::new);
    

    it will not produce a finite stream hence you would eventually end up with something along the lines of "java.lang.OutOfMemoryError: Java heap space".

    whereas if you were to execute this program with the use of limit, it will cause the computation to finish in a finite time:

    String[] limit = Stream.generate(() -> "test") // returns an infinite stream
                           .limit(20)
                           .toArray(String[]::new);