我有一个并行执行一系列操作的流,然后我必须将结果写入文件,所以我需要写操作是顺序的,但它需要作为流执行,我有很多数据写,我不能使用中间集合。 有没有办法做到这一点?
我想到了一个似乎不太干净的解决方案,那就是使写入方法同步。这种方法是唯一可能的吗?还有其他方法吗?
谢谢。
答案 0 :(得分:4)
无需将Stream
转换为顺序即可执行顺序终端操作。例如,请参阅Stream.forEachOrdered
的文档:
此操作一次处理一个元素,如果存在,则按顺序处理。对一个元素执行操作happens-before为后续元素执行操作,但对于任何给定元素,该操作可以在库选择的任何线程中执行。
换句话说,由于前面步骤的并行处理,可以由不同的线程调用该操作,但是保证它是线程安全的,不会同时调用该操作,甚至维护该流的顺序是订购。
因此,如果使用forEachOrdered
指定将文件写入终端操作,则无需执行任何其他同步。
类似的保证适用于某些功能的其他终端操作。研究特定操作的文档并了解哪些保证以及未指定的内容至关重要。