Java 8 Stream API中的collect操作被定义为可以安全地并行执行的 mutable reduction ,即使生成的Collection
不是线程安全的。
我们可以对Stream.toArray()
方法说同样的话吗?
即使Stream
是并行流并且结果数组不是线程安全的,这个方法是否是一个线程安全的可变减少?
答案 0 :(得分:5)
根据https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#toArray-java.util.function.IntFunction-,应该是因为他们创建了
...分区执行或调整大小
可能需要的任何其他数组
在演绎中,由于Stream.toArray()
只是stream.toArray(Object[]::new)
,因此它也应该适用于Stream.toArray()
。
答案 1 :(得分:3)
toArray
操作是一种 Mutable Reduction ,虽然没有像collect
操作那样完全实现。相反,它在某些情况下更有效。但这些是未指定的实现细节。 toArray
本身的文档没有说明如何实现,所以关于你的问题,你必须诉诸更一般的陈述:
...所有流操作都可以串行或并行执行。
...
除了标识为明确不确定的操作(例如
findAny()
)之外,流是顺序执行还是并行执行不应更改计算结果。...
大多数流操作接受描述用户指定行为的参数,这些参数通常是lambda表达式。为了保持正确的行为,这些行为参数必须非干扰,并且在大多数情况下必须是无状态。
因此无论如何实现,toArray
都是可以并行运行的流操作,因为它没有指定具有任何限制或不确定行为,它将产生与顺序模式相同(正确)的结果。这是你唯一要考虑的事情。
但是如果您使用重载方法toArray(IntFunction)
,则您有责任提供适当的功能,例如SomeType[]::new
始终是非干扰和无状态的,因此toArray(SomeType[]::new)
形式也是线程安全的。