private Stream<User> getUserStream(Stream<User> testStream) {
Supplier<Stream<User>> supplierUserStream=()->userStream;
supplierUserStream.get().sorted();
supplierUserStream.get().sorted();// throw exception Stream has already been operated upon or closed
return userStream;
}
Supplier<Stream<User>> streamSupplier
= () -> Stream.of(userStream.toArray(size -> new User[size]));
仔细看这条信息(重点是我的):
IllegalStateException:流已经被操作或关闭
因为在第一条语句中没有终端操作,所以流并没有被关闭,而是被操作了,这就是为什么在第二次尝试对它进行操作时会出现错误的原因。
supplierUserStream.get().sorted().sorted();
但是,这将是一种潜在问题的隐藏。例如,如果将main
中的测试调用替换为以下语句,您将再次得到相同的问题:
getStringStream(Stream.of("Hello", "World")).forEach(System.out::println);
处理它的一个好方法可以是Ernest_k所建议的:
它也可以通过跟踪派生流对象来解决。Stream Stream=s.get().sorted();stream=stream.sorted();返回stream.sorted();以重用那些冗余的sort()调用。
import java.util.function.Supplier;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
getStringStream(Stream.of("World", "Hello", "Good morning!")).forEach(System.out::println);
}
private static Stream<String> getStringStream(Stream<String> testStream) {
Supplier<Stream<String>> supplierStringStream = () -> testStream;
Stream<String> stream = supplierStringStream.get().sorted();
return stream.sorted();
}
}
Good morning!
Hello
World
即使我在我的流中使用Supplier并在每次我想检索我的strem并对其执行终端操作时使用Supplier.get(),我仍然得到“Stream已经被操作或关闭”异常。有人能看看我的代码并建议我做错了什么吗? 引发异常的方法: 流供应商:
方法是 现在我试着像这样改成stream,但我不知道这种改是否正确: 如何避免出现例外,解决问题? 我应该以某种方式重构代码吗?
java-stream已被操作或关闭 与合作可以解决此问题。 所以我当前的代码如下: 相同的错误信息。
问题内容: 我正在尝试使用Stream API生成Order实例。我有一个创建订单的工厂函数,并且使用DoubleStream初始化订单金额。 如果我使用文字(1.0)初始化Order实例,则可以正常工作。当我使用doubleStream创建随机数量时,将引发异常。 问题答案: 答案在(重点是我的)的javadoc中: 流仅应操作一次(调用中间流或终端流操作) 。例如,这排除了“分叉”流,其中相同
下面是我的代码: 从下面的函数调用上面的函数: 我不知道为什么。
我想复制一个Java8流,这样我可以处理它两次。我可以