ParallelStream for Files

时间:2014-08-21 21:13:12

标签: java java-8

Java 8中的新Stream API非常好用,特别是对于并行处理功能。但是,我不知道如何在Collections parallelStream方法之外应用并行处理。

例如,如果我从文件创建一个Stream,我使用以下内容:

Stream<String> lines = Files.lines(Paths.get("test.csv"));

但是,没有对应的parallelStream方法,就像在Collections中一样。看起来可能有一个线程抓住下一行,而可能有几个线程正在解析和处理这些行。

可以使用StreamSupport.stream()吗?

2 个答案:

答案 0 :(得分:8)

有一个更简单的答案:通过调用.parallel()可以将任何流转为并行:

Stream<String> lines = Files.lines(Paths.get("test.csv"))
                            .parallel();

Collection上的.parallelStream()方法只是一种方便。

请注意,除非您每行执行大量处理,否则文件中IO的顺序性质可能会占主导地位,您可能无法获得所希望的并行性。

答案 1 :(得分:0)

是 - 事实证明您可以使用StreamSupport.stream()从顺序流创建并行流。按照我的问题模式,它将如下所示。

StreamSupport.stream(Files.lines(Paths.get("test.csv")).spliterator(), true);

'true'是让它平行。在测试中,它将使用从单个核心扩展到我的机器上的所有核心。它按顺序读取了行,但是行的处理没有按顺序完成,这对我来说很好。