Tet*_*Tet 15 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?
Run Code Online (Sandbox Code Playgroud)
乍一看,似乎该.spliterator()方法关闭了stream,但没有调用stream.close().至少如果我在.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
Run Code Online (Sandbox Code Playgroud)
这个问题可以扩展到其他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?
Run Code Online (Sandbox Code Playgroud)
这个问题的原因是,当stream需要明确地关闭时,以及在我不需要明确关闭它的情况下,当onClose()定义的行动发生时,要深入清晰?
Hol*_*ger 10
终端操作永远不会关闭流.关闭必须手动完成.自动关闭发生的唯一地方就是在flatMap操作中,手动关闭通常在运行中创建的子流将介于艰难和不可能之间.
这也适用于该Stream.spliterator()方法.在您的示例中,它没有任何区别,因为通过创建的流Stream.of(…)不需要关闭并且onClose默认情况下没有注册任何操作.
您必须查阅工厂方法的文档,以了解何时需要关闭流,例如Files#lines(Path, Charset).
另请参阅Stream上的collect操作是否关闭流和底层资源?或者Java 8在完成后Stream.iterator()自动关闭流吗?
Java 9 中 s的关闭没有任何变化。Stream如果要释放底层资源,您仍然需要手动执行此操作。你永远不应该依赖垃圾收集器来做这件事。文档仍然说:
流有一个
BaseStream.close()方法和实现AutoCloseable。在流关闭后对其进行操作将抛出IllegalStateException。大多数流实例实际上不需要在使用后关闭,因为它们由集合、数组或生成函数支持,不需要特殊的资源管理。通常,只有源是 IO 通道的流(例如由 所返回的流Files.lines(Path))才需要关闭。如果流确实需要关闭,则必须将其作为 try-with-resources 语句或类似控制结构中的资源打开,以确保在其操作完成后立即将其关闭。
| 归档时间: |
|
| 查看次数: |
758 次 |
| 最近记录: |