如何检查流实例是否已被消耗(意味着已调用终端操作,以便对终端操作的任何进一步调用可能会失败IllegalStateException: stream has already been operated upon or closed.
?
理想情况下,我想要一个方法,如果流尚未被消耗,则不会消耗该流,并且如果流已被消耗而没有捕获,则返回布尔值 falseIllegalStateException
来自流方法(因为使用异常进行控制流成本高昂且容易出错,特别是在使用标准异常时)。
类似的方法hasNext()
在 Iterator 中的异常抛出和布尔返回行为(尽管没有契约next()
).
Example:
public void consume(java.util.function.Consumer<Stream<?>> consumer, Stream<?> stream) {
consumer.accept(stream);
// defensive programming, check state
if (...) {
throw new IllegalStateException("consumer must call terminal operation on stream");
}
}
目标是如果客户端代码在不消耗流的情况下调用此方法,则尽早失败。
似乎没有方法可以做到这一点,我必须添加一个 try-catch 块来调用任何终端操作,例如iterator()
,捕获一个异常并抛出一个新的异常。
可接受的答案也可以是“不存在解决方案”,并有充分的理由说明为什么规范不能添加这样的方法(如果存在充分的理由)。看来 JDK 流通常在其终端方法的开头有以下代码片段:
// in AbstractPipeline.java
if (linkedOrConsumed)
throw new IllegalStateException(MSG_STREAM_LINKED);
因此对于这些流来说,实现这样的方法似乎并不那么困难。