我有这个片段: 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());但是为什么过滤器抛出异常而不是终端操作?我只使用最简单的代码来理解这个想法。我正在使用带有 Java 8 更新 122 的 Netbeans 8.2,也在 Intellij Idea 2018 Ultimate 中进行了测试。
1 回答
饮歌长啸
TA贡献1951条经验 获得超3个赞
根据Stream
javadoc:
一个流应该只被操作一次(调用一个中间或终端流操作)。例如,这排除了“分叉”流,其中相同的源提供两个或多个管道,或同一流的多次遍历。如果流实现检测到流正在被重用,它可能会抛出 IllegalStateException。但是,由于某些流操作可能返回其接收者而不是新的流对象,因此可能无法在所有情况下检测重用。
为避免这种情况,您可以使用Stream.Builder
另请参阅复制流以避免“流已被操作或关闭”
添加回答
举报
0/150
提交
取消