嗨,我有这个摘要。
final Stream<String>stream = getStream().filter(a->StringUtils.contains(a,"http"));
stream.filter(a->true);//LINE PROBLEM I JUST THOUGHT THAT THIS WOULD JUST IGNORE
System.out.println(stream.count());
但是抛出
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
我知道流只能使用一次,但是这行有什么问题呢?正在消耗流吗?
stream.filter(a->true);//NOT A TERMINAL OPERATION A INTERMEDIATE OPERATION
如果我撕破它只是使用我的代码
System.out.println(stream.filter(a->true).count());
不会引发异常。
如果我使用此代码,则会抛出NotException。
Stream<String>stream = getStream().filter(a->StringUtils.contains(a,"http"));
stream = stream.filter(a->true);
System.out.println(stream.count());
但是为什么过滤器会引发异常并且这不是最终操作
我只是用最简单的代码来了解这个想法。
我正在将Netbeans 8.2与Java 8 update 122一起使用,并且已在Intellij Idea 2018 Ultimate中进行了测试。
答案 0 :(得分:2)
根据Stream
javadoc:
一个流只能操作一次(调用中间流或终端流操作)。例如,这排除了“分叉”流,其中相同的源馈送了两个或多个管道,或同一流的多次遍历。如果流实现检测到正在重用该流,则可能抛出IllegalStateException。但是,由于某些流操作可能会返回其接收者而不是新的流对象,因此不可能在所有情况下都检测到重用。
为避免这种情况,您可以使用Stream.Builder
另请参阅Copy a stream to avoid "stream has already been operated upon or closed"