如何从 DirectoryStream 创建一个 Stream

How to make a Stream from a DirectoryStream

在阅读 DirectoryStream 的 API 时,我错过了很多功能。首先,它建议使用 for 循环从流转到 List。我想念 DirectoryStream 不是 Stream 的事实。

如何在 Java 8 中制作 Stream<Path> from a DirectoryStream

DirectoryStream 不是 Stream(它自 Java 7 以来一直存在,在 Java 8 中引入流 api 之前)但是它实现了 Iterable<Path> 接口,所以你可以这样写:

try (DirectoryStream<Path> ds = ...) {
  Stream<Path> s = StreamSupport.stream(ds.spliterator(), false);
}

DirectoryStream 有一个 returns 拆分器的方法。所以就这样做:

Stream<Path> stream = StreamSupport.stream(myDirectoryStream.spliterator(), false);

你可能想看看这个问题,这基本上就是你的问题的缩减:How to create a Stream from an Iterable

虽然可以使用 spliterator 方法将 DirectoryStream 转换为 Stream,但没有理由这样做。首先创建一个 Stream<Path>

例如,而不是调用 Files.newDirectoryStream(Path) just call Files.list(Path)

newDirectoryStream which accepts an additional Filter may be replaced by Files.list(Path).filter(Predicate) and there are additional operations like Files.find and Files.walk returning a Stream<Path>, however, I did not find a replacement for the case you want to use the “glob pattern” 的重载。这似乎是将 DirectoryStream 翻译成 Stream 可能有用的唯一情况(无论如何我更喜欢使用正则表达式)…