Java 8中的新Stream API非常好用,特别是对于并行处理功能。但是,我不知道如何在Collections parallelStream方法之外应用并行处理。
例如,如果我从文件创建一个Stream,我使用以下内容:
Stream<String> lines = Files.lines(Paths.get("test.csv"));
但是,没有对应的parallelStream方法,就像在Collections中一样。看起来可能有一个线程抓住下一行,而可能有几个线程正在解析和处理这些行。
可以使用StreamSupport.stream()吗?
答案 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'是让它平行。在测试中,它将使用从单个核心扩展到我的机器上的所有核心。它按顺序读取了行,但是行的处理没有按顺序完成,这对我来说很好。