当前位置: 首页 > 知识库问答 >
问题:

线程“main”java.lang.IllegalStateException中出现异常:流已被操作或关闭[duplicate]

易衡
2023-03-14

我有这个片段:

    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());
    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个答案

阴鸿才
2023-03-14

根据streamjavadoc:

一个流只应被操作一次(调用中间或终端流操作)。例如,这排除了“分叉”流,即相同的源提供两个或多个管道,或者相同流的多个遍历。如果流实现检测到流正在被重用,则可能引发IllegalStateException。然而,由于某些流操作可能返回它们的接收器而不是新的流对象,因此可能不可能在所有情况下检测重用。

若要避免这种情况,可以使用stream.builder

 类似资料: