Discussion: easier Stream closing

Tagir Valeev amaembo at gmail.com
Mon Sep 27 03:29:08 UTC 2021


On Sun, Sep 26, 2021 at 6:13 PM Remi Forax <forax at univ-mlv.fr> wrote:
>
> > List<Path> list =
> > Files.list(Path.of("/etc")).map(Path::getFileName).consumeAndClose(Stream::toList);
> >
> > What do you think?
>
> This one does not work because if Path::getFileName fails with an exception, close() will not be called.

Well, as Path::getFileName is not actually executed here, only linked,
there are only a few chances
when map(Path::getFileName) may fail. Probably StackOverflowError,
OutOfMemoryError, or LinkageError.
Probably not so important for properly functioning application. I
mean, if something of these happens, leaking
file descriptor would be a lesser problem.

With best regards,
Tagir Valeev.

> What you are proposing here is equivalent to
>   try(var stream = Files.list(Path.of("/etc")).map(Path::getFileName)) {
>     stream.toList()
>   }
>
> instead of
>   try(var stream = Files.list(Path.of("/etc"))) {
>     stream..map(Path::getFileName).toList()
>   }
>
> regards,
> Rémi
>
> >
> >
> > [1]
> > https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StackWalker.html#walk(java.util.function.Function)


More information about the core-libs-dev mailing list