Получить имена всех файлов в директории через Stream API

На вход получаем путь к директории dir. Нужно получить List, который содержит все имена файлов в данной директории. Если изначальная директория dir содержит в себе другие директории, то также нужно добавить имена файлов, содержащихся в них, в List. Сделать нужно через Stream API.

Пытался сделать так:

void getListWithNamesOfFiles(File dir) {
    List<String> listWithNameFiles =  Arrays.stream(dir.listFiles())
            .filter(e -> e.isFile())
            .map(e -> e.getName())
            .collect(Collectors.toList());

    Arrays.stream(dir.listFiles())
            .filter(e -> e.isDirectory())
            .forEach(e -> getListWithNamesOfFiles(e));
}

Но это не работает.


Ответы (1 шт):

Автор решения: Alexandr

Можно воспользоваться Files.walk:

package com.somepackage;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

    public static List<String> getListWithNamesOfFiles(Path path) {
        try (Stream<Path> walk = Files.walk(path)) {
            return walk
                    .filter(Files::isRegularFile)
                    .map(Path::getFileName)
                    .map(Path::toString)
                    .collect(Collectors.toList());
        } catch (IOException e) {
            throw new RuntimeException("Could not read files for path " + path);
        }
    }

    public static void main(String[] args) throws Exception {
        Path path =
                Paths.get(
                        System.getProperty("user.dir"));
        System.out.println(
                String.join(
                        "\n",
                        getListWithNamesOfFiles(path)));
    }

}
→ Ссылка