Мне было интересно, как ссылаться на результат лямбды в Java? Это сделано для того, чтобы я мог сохранить результаты в ArrayList, а затем использовать его для чего-нибудь в будущем.
У меня есть лямбда:
try {
Files.newDirectoryStream(Paths.get("."),path -> path.toString().endsWith(".txt"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
и внутри .forEach() я хочу иметь возможность назначать каждое имя файла массиву по очереди, например, .forEach(MyArrayList.add(this))
Спасибо за любую помощь заранее!




Вы можете создать переменную, которая представляет текущий элемент в forEach, и ссылаться на него, например:
ArrayList<Path> paths = new ArrayList<>();
Files.newDirectoryStream(Paths.get("."), path -> path.toString().endsWith(".txt"))
.forEach(path -> paths.add(path));
который также можно упростить до:
Files.newDirectoryStream(Paths.get("."), path -> path.toString().endsWith(".txt"))
.forEach(paths::add);
Использовать :
List<String> myPaths = new ArrayList<>();
Files.newDirectoryStream(Paths.get("."), path -> path.toString().endsWith(".txt"))
.forEach(e -> myPaths.add(e.toString()));
Редактировать :
Мы можем добиться того же в одной строке, используя:
List<String> myPaths = Files.list(Paths.get("."))
.filter(p -> p.toString().endsWith(".txt"))
.map(Object::toString)
.collect(Collectors.toList());
См. Также раздел Побочные эффекты в Пакет java.util.stream Описание. Для более эффективного выполнения следует заменить forEach на сокращение. См. Комментарий Хольгера к ответу ниже.
Вы можете добиться этого с помощью collecting в результате операции newDirectoryStream:
Вы можете add элементов в списке по мере его итерации, но это не лучший способ:
List<Path> listA = new ArrayList<>();
Files.newDirectoryStream(Paths.get(""), path -> path.toString().endsWith(".txt"))
.forEach(listA::add);
Вы можете использовать другой метод, например find, который возвращает Stream<Path>, который было бы проще использовать и собирать элементы в списке:
List<Path> listB = Files.find(Paths.get(""), 1,(p, b) -> p.toString().endsWith(".txt"))
.collect(Collectors.toList());
Или Files.list()
List<Path> listC = Files.list(Paths.get("")).filter(p -> p.toString().endsWith(".txt"))
.collect(Collectors.toList());
Или List<Path> listC = Files.list(Paths.get("")).filter(p -> p.toString().endsWith(".txt")).collect(Collectors.toList());
На мой взгляд, использование ссылки на метод paths :: add вместо path -> paths.add (path) было бы еще лучше.