首页 > 解决方案 > 如何使用`Files.walk`和提前终止

问题描述

我有一段类似的代码

Optional<Path> confFile = Files.walk(Paths.get("./")) // traverse and visit ...
              .filter(p -> p.getFileName().endsWith("configuration.properties")) // search config file

我希望流在找到任何此类文件后立即结束,并且在遍历所有子文件夹之前不要继续。

有没有办法做到这一点?

标签: javaperformancefilenavigation

解决方案


是的,它被称为findFirst

Optional<Path> confFile = Files.walk(Paths.get("./"))
                            .filter(p -> p.getFileName().endsWith("configuration.properties"))
                            .findFirst()

文档

返回一个描述此流的第一个元素的 Optional,如果流为空,则返回一个空的 Optional。如果流没有遇到顺序,则可以返回任何元素。

这是一个短路端子操作。

“短路”是指:

如果一个终端操作在有无限输入时可能会在有限时间内终止,那么它就是短路的。

请注意,不filter短路并不重要,因为filter它是惰性的,因此它只会处理findFirst所需数量的路径。


推荐阅读