Закрыть Java 8 Stream

Если мы используем Java 8 Stream, например list.stream().filter(....).collect(..)..... Когда он закрыт этим потоком?

Хорошо ли, что мы закрываем поток в качестве следующего примера?

Stream<String> stream = list.stream();
String result = stream.limit(10).collect(Collectors.joining(""));
stream.close();

Ответ 1

Как правило, вообще не нужно закрывать потоки. Вам нужно только закрыть потоки, которые используют ресурсы ввода-вывода.

Из Документация по потоку:

Потоки имеют метод BaseStream.close() и реализуют AutoCloseable, но почти все экземпляры потока фактически не нужно закрывать после использования. Как правило, только потоки, источник которых является каналом ввода-вывода (например, те, которые возвращаются Files.lines(Path, Charset)), требуют закрытия. Большинство потоков поддерживаются коллекциями, массивами или генерирующими функциями, которые не требуют специального управления ресурсами. (Если поток требует закрытия, он может быть объявлен как ресурс в инструкции try-with-resources.)

Если вам нужно закрыть поток, лучше всего использовать инструкцию try-with-resources:

try ( Stream<String> stream = Files.lines(path, charset) ) {
    // do something
}

Ответ 2

Что-то не так с закрытием потока ввода-вывода. Операция flatmap закроет поток. Если вы сделали что-то подобное, выкинет исключение.

try (Stream<Path> s = Files.walk(p, 1)) {
    return s.flatMap(Stream::of);
} catch (IOException ignore) {
}

см. fooobar.com/info/834635/...