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());
根据流
Javadoc:
一个流应该只被操作一次(调用中间或终端流操作)。例如,这排除了“分叉”流,即同一个源为两个或多个管道提供源,或者对同一个流进行多次遍历。如果流实现检测到正在重用该流,则可能引发IllegalStateException。然而,由于某些流操作可能返回其接收者而不是新的流对象,因此可能不可能在所有情况下检测重用。
为了避免这种情况,可以使用stream.builder
我有这个片段: 而是投掷: 我知道溪流只能用一次,但这条线有什么问题吗?它在吞噬溪流? 但为什么筛选器抛出异常而不是终端操作? 我只是使用最简单的代码来获得这个想法。 我使用的是Netbeans 8.2和Java 8 update 122也在Intellij Idea 2018 Ultimate中测试过。
方法是 现在我试着像这样改成stream,但我不知道这种改是否正确: 如何避免出现例外,解决问题? 我应该以某种方式重构代码吗?
下面是我的代码: 从下面的函数调用上面的函数: 我不知道为什么。
我想复制一个Java8流,这样我可以处理它两次。我可以
我想复制一个Java 8流,这样我可以处理它两次。我可以作为列表并从中获取新流; 但我觉得应该有一个更高效/更优雅的方法。 有没有一种方法可以复制流而不将其变成集合? 我实际上正在处理一个流,所以在移动到右侧投影并以另一种方式处理之前,希望先以一种方式处理左侧投影。类似于这样(到目前为止,我不得不使用技巧)。