6.5 限制
之前提到过使用并行流能工作,但这样说有点无耻。虽然只需一点改动,就能让已有代码并行化运行,但前提是代码写得符合约定。为了发挥并行流框架的优势,写代码时必须遵守一些规则和限制。
之前调用reduce方法,初始值可以为任意值,为了让其在并行化时能工作正常,初值必须为组合函数的恒等值。拿恒等值和其他值做reduce操作时,其他值保持不变。比如,使用reduce操作求和,组合函数为(acc, element) -> acc + element,则其初值必须为0, 因为任何数字加0,值不变。
reduce操作的另一个限制是组合操作必须符合结合律。这意味着只要序列的值不变,组合操作的顺序不重要。有点疑惑?别担心!请看例6-5,我们可以改变加法和乘法的顺序,但结果是一样的。
例6-5 加法和乘法满足结合律
(4 + 2) + 1 = 4 + (2 + 1) = 7(4 * 2) * 1 = 4 * (2 * 1) = 8
要避免的是持有锁。流框架会在需要时,自己处理同步操作,因此程序员没有必要为自己的数据结构加锁。如果你执意为流中要使用的数据结构加锁,比如操作的原始集合,那么有可能是自找麻烦。
在前面我还解释过,使用parallel方法能轻易将流转换为并行流。如果读者在阅读本书的同时,还查看了相应的API,那么可能会发现还有一个叫sequential的方法。在要对流求值时,不能同时处于两种模式,要么是并行的,要么是串行的。如果同时调用了parallel和sequential方法,最后调用的那个方法起效。
