I don't think it is a perfect solution to combine the close operation with the terminator operation, because there are similar issues in the intermediate operation.
Consider this use case (for example only): try (var stream = Files.list(path) .flatMap(dir -> { try { return Files.list(dir); } catch (IOException e) { return Stream.empty(); } })) { // ... } It looks closed, but it doesn't. Closing the Stream generated by flatMap will not close all member Stream. Further consideration is needed to deal with the problem of closing the Stream. Perhaps it is a withCleaner method that registers the Stream with the cleaner, or other solutions. Tagir F.Valeev <tval...@openjdk.java.net> 于2021年10月4日周一 下午2:52写道: > Currently, when the stream holds a resource, it's necessary to wrap it > with try-with-resources. This undermines the compact and fluent style of > stream API calls. For example, if we want to get the `List` of files inside > the directory and timely close the underlying filehandle, we should use > something like this: > > > List<Path> paths; > try (Stream<Path> stream = Files.list(Path.of("/etc"))) { > paths = stream.toList(); > } > // use paths > > > I suggest to add a new default method to Stream interface named > `consumeAndClose`, which allows performing terminal stream operation and > closing the stream at the same time. It may look like this: > > > default <R> R consumeAndClose(Function<? super Stream<T>, ? extends R> > function) { > Objects.requireNonNull(function); > try(this) { > return function.apply(this); > } > } > > > Now, it will be possible to get the list of the files in the fluent manner: > > > List<Path> list = > Files.list(Path.of("/etc")).consumeAndClose(Stream::toList); > > ------------- > > Commit messages: > - Fix tests > - 8274412: Add a method to Stream API to consume and close the stream > without using try-with-resources > > Changes: https://git.openjdk.java.net/jdk/pull/5796/files > Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5796&range=00 > Issue: https://bugs.openjdk.java.net/browse/JDK-8274412 > Stats: 140 lines in 5 files changed: 135 ins; 0 del; 5 mod > Patch: https://git.openjdk.java.net/jdk/pull/5796.diff > Fetch: git fetch https://git.openjdk.java.net/jdk > pull/5796/head:pull/5796 > > PR: https://git.openjdk.java.net/jdk/pull/5796 >