首页
学习
活动
专区
圈层
工具
发布

递归流
EN

Stack Overflow用户
提问于 2014-02-08 21:39:13
回答 1查看 8.8K关注 0票数 20

我想使用Java8递归列出我计算机上的所有文件。

Java8提供了一个listFiles方法,该方法返回所有的文件和目录,但没有递归。如何使用它来获得完整的文件递归列表(不使用变异的集合)?

我试过下面的代码,但它只深入一层:

代码语言:javascript
复制
static Function<Path, Stream<Path>> listFiles = p -> {
    if (p.toFile().isDirectory()) {
        try { return Files.list(p); }
        catch (Exception e) { return Stream.empty(); }
    } else {
        return Stream.of(p);
    }
};

public static void main(String[] args) throws IOException {
    Path root = Paths.get("C:/temp/");
    Files.list(root).flatMap(listFiles).forEach(System.out::println);
}

并且使用return Files.list(p).flatMap(listFiles);不能编译(不确定原因)...

注意:我对涉及FileVisitors或外部库的解决方案不感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-09 05:31:44

通过递归遍历文件系统来生成路径流的新API是Files.walk

如果您确实希望以递归方式生成流(不一定遍历文件树,但我将继续使用它作为示例),那么使用方法引用来完成递归可能会更简单一些:

代码语言:javascript
复制
class RecursiveStream {
    static Stream<Path> listFiles(Path path) {
        if (Files.isDirectory(path)) {
            try { return Files.list(path).flatMap(RecursiveStream::listFiles); }
            catch (Exception e) { return Stream.empty(); }
        } else {
            return Stream.of(path);
        }
    }

    public static void main(String[] args) {
        listFiles(Paths.get(".")).forEach(System.out::println);
    }
}

事实证明,方法引用对于将具有与函数接口相同的“形状”(参数和返回类型)的命名方法适配到该函数接口非常有用。这也避免了在实例或静态变量中存储lambda并递归调用自身的潜在初始化循环。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21646683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档