【发布时间】:2017-06-13 02:24:20
【问题描述】:
使用JUnit 和Stream 我收到以下错误消息:
java.lang.IllegalStateException: stream has already been operated upon or closed
我做了一项研究,很明显不可能重用流
但是根据这篇文章:
使用Supplier 可以解决此问题。
所以我当前的代码如下:
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());
}
您如何看到我使用supplier.get() 与Stream 一起工作(它根据教程),但@Test 打印直到B ,因此@Test 在supplier.get().skip(1050).findFirst().get() 中失败,它仍然生成相同的错误消息。
我的代码和教程之间的独特区别是,mime 通过文件工作,而教程围绕数组工作。
有什么特别的东西可以毫无问题地编辑吗?
阿尔法
我做了以下版本(按照尤金的sn-p代码)
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));
}
同样的错误信息。
【问题讨论】:
标签: java java-8 java-stream