【问题标题】:How to use ` Files.walk` and early termination如何使用`Files.walk`和提前终止
【发布时间】:2020-07-15 08:20:02
【问题描述】:
我有一段类似这样的代码
Optional<Path> confFile = Files.walk(Paths.get("./")) // traverse and visit ...
.filter(p -> p.getFileName().endsWith("configuration.properties")) // search config file
我希望流在找到任何此类文件后立即结束,并且在遍历所有子文件夹之前不要继续。
有没有办法做到这一点?
【问题讨论】:
标签:
java
performance
file
navigation
【解决方案1】:
是的,它叫findFirst:
Optional<Path> confFile = Files.walk(Paths.get("./"))
.filter(p -> p.getFileName().endsWith("configuration.properties"))
.findFirst()
来自docs:
返回一个描述此流的第一个元素的 Optional,如果流为空,则返回一个空的 Optional。如果流没有遇到顺序,则可以返回任何元素。
这是一个短路终端操作。
“短路”是指:
如果终端操作在无限输入时可能在有限时间内终止,则它是短路的。
请注意,filter 不是短路并不重要,因为filter 是惰性的,所以它只会处理findFirst 需要的尽可能多的路径。