Quando um Java 8 Stream é considerado consumido?

Meu entendimento era que um Java 8Stream é considerado consumido uma vez que uma operação do terminal, comoforEach() oucount(), é realizado.

No entanto, o caso de testemultipleFilters_separate abaixo lança umIllegalStateException Apesar defilter é uma operação intermediária lenta, chamada apenas como duas instruções. E, no entanto, posso encadear as duas operações de filtro em uma única instrução e funciona.

@Test(expected=IllegalStateException.class)
public void multipleFilters_separate() {
    Stream<Double> ints = Stream.of(1.1, 2.2, 3.3);
    ints.filter(d -> d > 1.3);
    ints.filter(d -> d > 2.3).forEach(System.out::println);
}

@Test
public void multipleFilters_piped() {
    Stream<Double> ints = Stream.of(1.1, 2.2, 3.3);
    ints.filter(d -> d > 1.3)
        .filter(d -> d > 2.3)
        .forEach(System.out::println);
}

A partir disso, estou assumindo umaStream é considerado consumido após a primeira instrução que a utiliza, independentemente de chamar uma operação de terminal ou não. Isso soa certo?

questionAnswers(2)

yourAnswerToTheQuestion