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/