java - stream.spliterator() 是否关闭流?

标签 java java-8 java-stream spliterator

stream.spliterator() 是否隐式关闭了 stream,还是之后需要显式关闭它?

Stream<String> stream = Stream.of("a", "b", "c");
Spliterator<T> spliterator = stream.spliterator();
// Some low lever operation with the spliterator
stream.close(); // do we need to close?

乍一看,.spliterator() 方法似乎关闭了stream,但没有调用stream.close()。至少如果我在调用 .spliterator() 方法后立即关闭它,它似乎不会影响 spliterator 操作。

Stream<String> stream = Stream.of("a", "b", "c").limit(2);
Spliterator<T> spliterator = stream.spliterator();
stream.close();
// Some low lever operation with the spliterator

这个问题可以扩展到其他stream方法,例如.findAny()

stream.findAny() // Can I assume that I don't need to close the stream?
stream.onClose(() -> System.out.println("hi!")).findAny()`
// when the `onClose()` action will be called?

这个问题的原因是为了更清楚何时 stream 需要显式关闭,而在我不需要显式关闭它的情况下,当 onClose () 定义的 Action 会发生吗?

最佳答案

终端操作从不关闭流。关闭必须手动完成。唯一发生自动关闭的地方是在 flatMap 操作中,手动关闭通常在运行中创建的子流将介于困难和不可能之间。

这也适用于 Stream.spliterator() 方法。在您的示例中,这没有区别,因为通过 Stream.of(...) 创建的流不需要关闭,并且默认情况下没有注册 onClose() 操作。

您必须查阅工厂方法的文档才能确定何时需要关闭流。例如。喜欢Files#lines(Path, Charset) .

另见 Does collect operation on Stream close the stream and underlying resources?Does Java 8 Stream.iterator() auto-close the stream when it's done?

关于java - stream.spliterator() 是否关闭流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46688829/

相关文章:

java - 如何将静态导入方法与 forEach 一起使用?

Java 8 stream.collect( ... groupingBy ( ... mapping( ... reducing ))) 减少 BinaryOperator 的使用

java - Java 8 中添加 Stream.Builder.accept(T t) 方法有什么意义?

java - NetBeans 更改 Ant 版本

java - java中的xml dom解析器?

java - @GetMapping 不序列化 ID

java - 无法解析: Unable to obtain OffsetDateTime from TemporalAccessor:

java - Gradle 不允许通过 Windows 命令提示符输入

java - 实现 java.lang.Iterator 时如何处理异常

lambda - java 8 - 从 map 中过滤值列表的方法?