线程“main”java.lang.IllegalStateException中的异常:

我有这个片段:


    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 中进行了测试。


慕仙森
浏览 139回答 1
1回答

饮歌长啸

根据Streamjavadoc:一个流应该只被操作一次(调用一个中间或终端流操作)。例如,这排除了“分叉”流,其中相同的源提供两个或多个管道,或同一流的多次遍历。如果流实现检测到流正在被重用,它可能会抛出 IllegalStateException。但是,由于某些流操作可能返回其接收者而不是新的流对象,因此可能无法在所有情况下检测重用。为避免这种情况,您可以使用Stream.Builder另请参阅复制流以避免“流已被操作或关闭”
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java