Я понял, что Java 8 Stream
считается потребляемым после выполнения терминальной операции, например forEach()
или count()
.
Однако тестовый пример multipleFilters_separate
ниже вызывает IllegalStateException
, хотя filter
является ленивой промежуточной операцией, просто называемой как два оператора. И тем не менее, я могу связать две операции фильтра с одним оператором и работать.
@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);
}
Из этого я предполагаю, что Stream
считается потребляемым после первого оператора, который использует его, независимо от того, вызывает ли этот оператор операцию терминала или нет. Правильно ли это звучит?