Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“线程中的异常”;“主要”;java.lang.IllegalStateException:流已被操作或关闭_Java_Java 8_Java Stream - Fatal编程技术网

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

“线程中的异常”;“主要”;java.lang.IllegalStateException:流已被操作或关闭,java,java-8,java-stream,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()); 我知道溪流只

我有一段话:

    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());
我知道溪流只能使用一次,但这条线有什么问题?它在消耗小溪

stream.filter(a->true);//NOT A TERMINAL OPERATION A INTERMEDIATE OPERATION
如果我把它撕碎了,就这样用我的代码

System.out.println(stream.filter(a->true).count());
不会引发异常

如果我使用此代码,则会引发NoteException

    Stream<String>stream = getStream().filter(a->StringUtils.contains(a,"http"));
    stream = stream.filter(a->true);
    System.out.println(stream.count());
Streamstream=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中进行了测试。

根据javadoc:

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

要避免这种情况,您可以使用


另请参见

这是请求流吗?重写HttpInputMessage和httpmessageconverter,然后使用IOUtils.toString()将流转换为字符串,然后使用lambda表达式。这只是一个示例。。表示想法。嗨,但筛选器不是终端操作。为什么会引发此异常?@chiperortiz这没关系。请参阅doc中的第一句:(调用中间流或终端流操作)非常好。
    Stream<String>stream = getStream().filter(a->StringUtils.contains(a,"http"));
    stream = stream.filter(a->true);
    System.out.println(stream.count());