我知道intermediate and terminal stream operations之间的区别。但是,当我遇到下面的代码示例时,我无法完全弄清楚原因,为什么第2行中的filter操作关闭流,导致第3行中出现以下异常:
java.lang.IllegalStateException:流已被操作 或关闭
为什么中间过滤器操作会关闭流? 在没有终端操作和/或未将其分配给变量的情况下在流上调用中间操作时,是否总是这样?
代码示例:
Stream<Integer> stream = Stream.of(1, 2, 3);
stream.filter(d -> d > 1);
stream.filter(d -> d > 2).forEach(System.out::print);
答案 0 :(得分:0)
重点是方法过滤器返回新流。旧版本在过滤后终止。
/**
* Returns a stream consisting of the elements of this stream that match
* the given predicate.
*
* <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
*
* @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
* <a href="package-summary.html#Statelessness">stateless</a>
* predicate to apply to each element to determine if it
* should be included
* @return the new stream
*/
Stream<T> filter(Predicate<? super T> predicate);