如何使用 `Files.walk` 和提前终止

How to use ` Files.walk` and early termination

我有一段类似的代码

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

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

有办法吗?

是的,它叫做findFirst:

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

来自docs

Returns an Optional describing the first element of this stream, or an empty Optional if the stream is empty. If the stream has no encounter order, then any element may be returned.

This is a short-circuiting terminal operation.

“短路”是指:

A terminal operation is short-circuiting if, when presented with infinite input, it may terminate in finite time.

注意filter没有短路并不重要,因为filter是惰性的,所以它只会处理findFirst需要的路径。