如何从DirectoryStream创建流

Thi*_*ler 20 java java-8 java-stream

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

我怎样才能让一个Stream<Path>DirectoryStreamJava中8?

Hol*_*ger 33

虽然可以使用其方法将a转换DirectoryStream为a ,但没有理由这样做.只需创建一个首先.StreamspliteratorStream<Path>

例如,而不是Files.newDirectoryStream(Path)只是打电话Files.list(Path).

其中的重载newDirectoryStream接受一个额外的Filter可能被替换,Files.list(Path).filter(Predicate)并且还有其他操作,例如Files.findFiles.walk返回a Stream<Path>,但是,我没有找到替换你想要使用"glob模式"的情况.这似乎是将a DirectoryStream转换为a Stream可能有用的唯一情况(我更喜欢使用正则表达式)...


ass*_*ias 14

DirectoryStream是不是Stream(自Java 7以来,在Java 8中引入了流API之前),但它实现了Iterable<Path>接口,因此您可以编写:

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

  • 注意`List`也存在于stream之前,但它们确实添加了`asStream()`;) (6认同)
  • 注意以下@Holger的答案-如果直接通过Files.newDirectoryStream(Path)获取流,则可以避免转换。 (2认同)