问题背景
fold、foldLeft、foldRight是scala常用的列表规约操作,最终实现的效果也差不多,但他们的区别在哪里呢?发现网上文章很多,能讲清楚的很少。
问题描述
三个函数都是给定一个起始值和一个规约函数对列表进行规约,例如:
scala> List(1,2,3,4,5).fold(0)(_ + _)
res3: Int = 15
scala> List(1,2,3,4,5).foldLeft(0)(_ + _)
res4: Int = 15
scala> List(1,2,3,4,5).foldRight(0)(_ + _)
res5: Int = 15
foldLeft和foldRight的区别很明显就是一个从左开始规约一个从右开始规约,那么fold和foldLeft的区别呢?
查看fold的实现,其实也是用的foldLeft
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)
但在最后运算时,会有些差别
首先是foldLeft,从最左边开始,用输入和列表中的数字相加,加完后的结果作为新的输入,以此类推。
fold则是将输入拆成若干个小的foldLeft然后做计算
一般来说,除非要使用分布式或者并行计算,否则可以只选带方向的fold。无特殊情况,优先选用foldLeft而不是foldRight