如何获得Files.walk的并行流?

时间:2015-11-08 17:09:15

标签: java file lambda java-8 java-stream

我需要递归地对文件夹中的所有文件进行一些只读处理。我正在使用Files.walk来获取文件流,但我注意到api指定walk仅返回常规流,而不是并行流。

如何并行处理目录中的所有文件?

2 个答案:

答案 0 :(得分:18)

您可以通过调用Stream将任何Stream转换为并行Stream::parallel

Stream<Path> stream = Files.walk(startPath).parallel().forEach(...);

答案 1 :(得分:3)

我有同样的问题。 Files.walk流似乎无法并行工作。通过调用foreach将流转换为并行流之后,处理仅在一个线程中进行。

唯一的解决方案是将收集到的parallel()转换为列表,并在该列表上创建并行流,如Tagir Valeev所述。

无效的解决方案:

Paths

工作解决方案:

Files.walk(Paths.get(System.getProperty("user.dir")))
                    .parallel()
                    .filter(Files::isRegularFile)
                    ...