Есть класс (который написан неправильно), который просто получает имена файлов из каталога:
Код: Выделить всё
public class StreamTest
{
public List getList(Path dir) {
return getStream(dir)
.map(filename -> filename.toString())
.collect(Collectors.toList());
}
private Stream
getStream(Path dir)
{
if (Files.exists(dir)) {
try {
Stream stream = Files.walk(dir, 1);
return stream
.filter(Files::isRegularFile)
.map(dir::relativize);
} catch (IOException e) {
System.out.println("Error");
}
}
return null;
}
}
Код: Выделить всё
public class Main {
public static void main(String[] args) {
Path dir = Paths.get("C:\\Projects\\Tests\\Walk");
StreamTest streamTest = new StreamTest();
List list = streamTest.getList(dir);
System.out.println(list);
}
}
Но когда я заменяю:
Код: Выделить всё
try {
Stream
stream = Files.walk(dir, 1);
Код: Выделить всё
try (Stream
stream = Files.walk(dir, 1)) {
А теперь вопрос:
Правильен ли этот подход на все? Я имею в виду получение потока из метода и работу над ним? Но как правильно использовать try-with-resources в такой ситуации?
Обходным решением является возврат списка некоторого сопоставленного типа (например, String) вместо Stream из getStream и работать с ним в методе getList, но мне любопытно, есть ли хороший ответ на заданный вопрос.
Конечно, я могу выполнить всю работу одним методом, но гипотетически я может вызвать getStream из нескольких других методов.
Подробнее здесь: https://stackoverflow.com/questions/790 ... arate-meth