在阅读DirectoryStream
的API时,我错过了很多功能。首先,它建议使用for循环从流到List
。我怀念DirectoryStream
不是Stream
的事实。
如何从Java 8中的Stream<Path>
创建DirectoryStream
?
答案 0 :(得分:31)
虽然可以使用DirectoryStream
方法将Stream
转换为spliterator
,但没有理由这样做。只需首先创建一个Stream<Path>
。
例如,而不是致电Files.newDirectoryStream(Path)
而只是致电Files.list(Path)
。
接受额外Filter
的{{3}}的重叠可能会被Files.list(Path).filter(Predicate)
取代,而newDirectoryStream
和Files.find
等其他操作会返回Stream<Path>
但是,我没有找到您要使用Files.walk
的案例的替代品。这似乎是将DirectoryStream
翻译成Stream
可能有用的唯一情况(我更喜欢使用正则表达式)...
答案 1 :(得分:13)
DirectoryStream
不是Stream
(自Java 7以来一直存在,在Java 8中引入了流API之前),但它实现了Iterable<Path>
接口,因此您可以编写:< / p>
try (DirectoryStream<Path> ds = ...) {
Stream<Path> s = StreamSupport.stream(ds.spliterator(), false);
}
答案 2 :(得分:2)
DirectoryStream
有一个返回spliterator的方法。所以就这样做:
Stream<Path> stream = StreamSupport.stream(myDirectoryStream.spliterator(), false);
您可能希望看到这个问题,这基本上是您的问题减少到的问题:How to create a Stream from an Iterable。
答案 3 :(得分:-1)
以下是在Windows平台上成功运行的另一个示例。此示例代码解决了此帖子的主标题中的问题。标题和主体中概述的问题似乎存在分歧。尽管如此,我确实认为这是对这篇文章的相关贡献。
"note":""