Получение результата лямбды в Java - PullRequest
0 голосов
/ 02 октября 2018

Мне было интересно, как ссылаться на результат лямбды в 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))

Спасибо за любую помощь заранее!

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Использование:

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());
0 голосов
/ 02 октября 2018

Этого можно достичь с помощью collecting результата операции newDirectoryStream:

  1. Вы можете add элементы в списке, когда вы повторяете его, но это нелучший способ:

    List<Path> listA = new ArrayList<>();
    Files.newDirectoryStream(Paths.get(""), path -> path.toString().endsWith(".txt"))
         .forEach(listA::add);
    
  2. Вы можете использовать другой метод, например find, который возвращает Stream<Path>, который будет проще использовать и собирать элементы в списке:

    List<Path> listB = Files.find(Paths.get(""), 1,(p, b) -> p.toString().endsWith(".txt"))
                            .collect(Collectors.toList());
    
  3. Или Files.list()

    List<Path> listC = Files.list(Paths.get("")).filter(p -> p.toString().endsWith(".txt"))
                            .collect(Collectors.toList());
    
0 голосов
/ 02 октября 2018

Вы можете создать переменную, которая представляет текущий элемент в 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);
...