“线程中的异常”;“主要”;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());