线程“主”中的异常java.lang.IllegalStateException:流已被操作或关闭

时间:2019-02-28 13:09:36

标签: java java-8 java-stream

嗨,我有这个摘要。

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

1 个答案:

答案 0 :(得分:2)

根据Stream javadoc:

  

一个流只能操作一次(调用中间流或终端流操作)。例如,这排除了“分叉”流,其中相同的源馈送了两个或多个管道,或同一流的多次遍历。如果流实现检测到正在重用该流,则可能抛出IllegalStateException。但是,由于某些流操作可能会返回其接收者而不是新的流对象,因此不可能在所有情况下都检测到重用。

为避免这种情况,您可以使用Stream.Builder

另请参阅Copy a stream to avoid "stream has already been operated upon or closed"