Java 8 Streams,作为并行流执行部分工作,另一个作为顺序流执行

时间:2014-12-16 11:11:18

标签: java java-8 java-stream

我有一个并行执行一系列操作的流,然后我必须将结果写入文件,所以我需要写操作是顺序的,但它需要作为流执行,我有很多数据写,我不能使用中间集合。 有没有办法做到这一点?

我想到了一个似乎不太干净的解决方案,那就是使写入方法同步。这种方法是唯一可能的吗?还有其他方法吗?

谢谢。

1 个答案:

答案 0 :(得分:4)

无需将Stream转换为顺序即可执行顺序终端操作。例如,请参阅Stream.forEachOrdered的文档:

  

此操作一次处理一个元素,如果存在,则按顺序处理。对一个元素执行操作happens-before为后续元素执行操作,但对于任何给定元素,该操作可以在库选择的任何线程中执行。

换句话说,由于前面步骤的并行处理,可以由不同的线程调用该操作,但是保证它是线程安全的,不会同时调用该操作,甚至维护该流的顺序是订购

因此,如果使用forEachOrdered指定将文件写入终端操作,则无需执行任何其他同步。

类似的保证适用于某些功能的其他终端操作。研究特定操作的文档并了解哪些保证以及未指定的内容至关重要。