java.lang.IllegalStateException: stream has already been operated upon or closed
与供应商
合作可以解决此问题。
所以我当前的代码如下:
try (Stream<String> stream = Files.lines(Paths.get(fileName)) ) {
Supplier<Stream<String>> supplier = () -> stream;
logger.info("A");
logger.info("ABC {}", supplier.get().findFirst().get());
logger.info("B");
logger.info("XYZ {}", supplier.get().skip(1050).findFirst().get());
logger.info("C");
assertThat(supplier.get().count(), is(1051));
}
catch (IOException e) {
logger.error("{}", e.getMessage());
}
try (Stream<String> stream = Files.lines(Paths.get(fileName)) ) {
Supplier<Stream<String>> supplier = () -> stream.collect(Collectors.toList()).stream();
logger.info("A");
logger.info("ABC {}", supplier.get().findFirst().get());
logger.info("B");
logger.info("XYZ {}", supplier.get().skip(1050).findFirst().get());
logger.info("C");
assertThat(supplier.get().count(), is(1051));
}
相同的错误信息。
供应商
并不神奇,您仍然需要一直从该供应商提供一个新的流。
所以你可以做:
Supplier<Stream<String>> supplier = () -> Files.lines(Paths.get(fileName));
但这意味着要一直阅读文件。您可以将所有行读入单个列表
,将其存储在内存中,并将其存储在流
中。
List<String> allLines = Files.readAllLines(Paths.get(fileName));
Supplier<Stream<String>> supplier = () -> allLines.stream();
Supplier<Stream<String>> streamSupplier = () -> Stream.of(array);
即使我在我的流中使用Supplier并在每次我想检索我的strem并对其执行终端操作时使用Supplier.get(),我仍然得到“Stream已经被操作或关闭”异常。有人能看看我的代码并建议我做错了什么吗? 引发异常的方法: 流供应商:
方法是 现在我试着像这样改成stream,但我不知道这种改是否正确: 如何避免出现例外,解决问题? 我应该以某种方式重构代码吗?
据我所知,如果您使用供应商,您可以通过在供应商上使用get()func来随时使用流。我仍然得到“流已经被操作或关闭”。 请帮助我理解,是否有任何限制使用流通过供应商以及??
问题内容: 我正在尝试使用Stream API生成Order实例。我有一个创建订单的工厂函数,并且使用DoubleStream初始化订单金额。 如果我使用文字(1.0)初始化Order实例,则可以正常工作。当我使用doubleStream创建随机数量时,将引发异常。 问题答案: 答案在(重点是我的)的javadoc中: 流仅应操作一次(调用中间流或终端流操作) 。例如,这排除了“分叉”流,其中相同