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?