Сегодня я попытался реорганизовать этот код, который читает идентификаторы из файлов в каталоге,
Set<Long> ids = new HashSet<>();
for (String fileName : fileSystem.list("my-directory")) {
InputStream stream = fileSystem.openInputStream(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line;
while ((line = br.readLine()) != null) {
ids.add(Long.valueOf(line.trim()));
}
br.close();
}
с использованием потока api
Set<Long> ids = fileSystem.list("my-directory").stream()
.map(fileName -> fileSystem::openInputStream)
.map(is -> new BufferedReader(new InputStreamReader(is)))
.flatMap(BufferedReader::lines)
.map(String::trim)
.map(Long::valueOf)
.collect(Collectors.toSet());
Затем я обнаружил, что потоки ввода-вывода не будут закрыты, и я не вижу простого способа их закрыть, потому что они созданы внутри конвейера.
Любые идеи?
upd: Файловая система в примере - HDFS, Files#lines
и подобные методы не могут быть использованы.