Java: чтение из папки File и добавление каждого в ArrayList - PullRequest
0 голосов
/ 27 апреля 2020

Рассмотрим этот фрагмент кода:

private static ArrayList<Level> levels = new ArrayList<>();

static {
    try (Stream<Path> paths = Files.walk(Paths.get("levels"))) {
        paths
            .filter(Files::isRegularFile)
            .forEach(levels.add(new Level(file))); //CAN'T DO!!
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

Я думаю, что код в значительной степени говорит о том, что я пытаюсь сделать. Я где-то нашел этот фрагмент кода и попытался применить его для создания объектов Level из папки с файлами, такими как level1.txt, level2.txt и т. Д. c. Класс Level принимает File в качестве аргумента.

Метод forEach выдает SyntaxError.

  1. Что такое "::" в методе фильтра?
  2. Почему путь переносится новой строкой и двумя методами? Никогда раньше такого не видел.
  3. Как я могу заставить эту работу работать правильно?

1 Ответ

1 голос
/ 27 апреля 2020
  1. , следующий за , хорошо объясняет, что такое оператор :: (double colon), поскольку Java 8

  2. Код может быть выполнен в несколько строк , но это так же, как следующее. Вы вызываете метод filter, затем вызываете forEach для объекта, возвращаемого filter

    paths.filter(Files::isRegularFile).forEach(levels.add(new Level(file)));   
    
  3. Чтобы все заработало, вам нужно определить переменную file, это сделано с функциями лямбды

    paths.filter(Files::isRegularFile).forEach(file -> levels.add(new Level(file)));   
    

НЕ ВОЗМОЖНО, потому что walks() throws IOException

В случае, если вам не нужен try/catch Вы можете использовать Collectors для непосредственного построения списка

private static ArrayList<Level> levels = Files.walk(Paths.get("levels"))
                                              .filter(Files::isRegularFile)
                                              .map(file -> new Level(file))
                                              .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...