On Sun, 3 Oct 2021 11:00:25 GMT, Tagir F. Valeev <[email protected]> wrote:
> 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);
CSR is [posted](https://bugs.openjdk.java.net/browse/JDK-8274994), please
review!
-------------
PR: https://git.openjdk.java.net/jdk/pull/5796