使用Java 8 Stream从root用户递归添加所有文件

S-K*_*-K' 5 java java-8 java-stream

我有以下递归方法,只是将给定文件夹中的所有子项添加到列表中:

private List<TemplateFile> readTemplateFiles(String nextTemplateDir, String rootTemplateDir) throws FileNotFoundException {
    List<TemplateFile> templateFiles = new ArrayList<>();

    for (File file : new File(nextTemplateDir).listFiles()) {
        if (!file.isDirectory() && !file.getName().startsWith(".")) {
            templateFiles.add(TemplateFile.create(file, rootTemplateDir));
        } else if (file.isDirectory()) {
            templateFiles.addAll(readTemplateFiles(file.getAbsolutePath(), rootTemplateDir));
        }
    }

    return templateFiles;
}
Run Code Online (Sandbox Code Playgroud)

我怎么能使用新的Java 8 Stream API重构这个方法?

Tun*_*aki 5

您可以使用Files.walk(start, options...)递归遍历文件树.此方法返回Stream<Path>包含Path从给定根开始的所有内容.

通过遍历以给定起始文件为根的文件树来返回Stream懒惰填充的内容Path.遍历深度优先的文件树,流中的元素Path是通过解析相对路径获得的对象start.

private List<TemplateFile> readTemplateFiles(String nextTemplateDir, String rootTemplateDir) throws FileNotFoundException {
    return Files.walk(Paths.get(nextTemplateDir))
                .filter(path -> !path.getFileName().startsWith("."))
                .map(path -> TemplateFile.create(path.toFile(), rootTemplateDir))
                .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

在这些选项中,有FOLLOW_LINKS符号链接.