Я думаю, что все ресурсы, которые я так или иначе изучал, подчеркивают, что поток может быть использован только один раз, а потребление выполняется так называемыми терминальными операциями (что мне очень ясно).
Просто из любопытства я попробовал это:
import java.util.stream.IntStream;
class App {
public static void main(String[] args) {
IntStream is = IntStream.of(1, 2, 3, 4);
is.map(i -> i + 1);
int sum = is.sum();
}
}
что в итоге выдает исключение времени выполнения:
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
at java.util.stream.IntPipeline.reduce(IntPipeline.java:456)
at java.util.stream.IntPipeline.sum(IntPipeline.java:414)
at App.main(scratch.java:10)
Это обычно, я что-то упускаю, но все же хочу спросить: насколько я знаю, map
- это промежуточная (и ленивая) операция, которая сама по себе ничего не делает в Stream. Только когда вызывается sum
операции терминала (которая является энергичной операцией), поток используется и используется.
Но почему я должен их связывать?
В чем разница между
is.map(i -> i + 1);
is.sum();
а также
is.map(i -> i + 1).sum();
?