Scala的foldLeft /:和foldRight :\的原理理解以及区别对照
写在前面:阅读本文的前提是已掌握Scala的基本语法
1.左折叠foldLeft
让我们来看看下面的例子
这是左折叠的一个典型例子,List(1,2,3) 是我们的操作主体 foldLeft是方法 0 是操作结果集(个人理解),这里的0是指初始值为0 后面是(sum,i)=>sum+i 是操作函数,我们可以用任意合乎语法规则的函数来替换它,完成个性化的操作
这里你可能会有疑问,结果为6,是怎么得出的?是 0+1+2+3得出的吗? 答案是肯定的,但是不准确,正确的答案应该是:((0+1)+2)+3=6 为什么要这样说呢?下面我们来剖析上图这个例子:
记住了啊,此时的 i 代表List里面遍历出来的元素,且顺序是从左到右。i 处于(sum,i)中的右边,而且 i 是遍历出来的(这句话可以方便你理解)
此时,可以看出sum一直没变,为什么呢?因为sum初始值为0,而我们没有给他进行任何操作赋值
从上例可以看出,最后得到的结果就是sum(我们前文给它定义为结果集),最后的sum=2*3=6 所以,在左折叠范式
List(1,2,3).foldLeft(初始值)((x,y)函数体) 中 x等于操作后的初始值 y等于遍历出的函数元素 且顺序为从左到右
我想了一个口诀帮助你记忆:左折叠,列表从左,初始在左
List(1,2,3).foldLeft(0)((x,y)=>x+y) 的语法糖写法为:(0/:List(1,2,3))(_+_) 记住 斜杠是睡在冒号上的,斜杠在左就是左折叠,斜杠方为初始值,冒号方为列表
1.右折叠foldRight
左折叠的口诀是什么? 列表从左,初始在左。
那么右折叠呢?当然是 列表从右,初始在右。
验证我们的口诀
相应的语法糖为 (List(1,2,3) :\0)(_+_) 冒号所在方是需要折叠的列表方,需要折叠的列表永远不靠着\
PS: 操作函数也可以直接引用哦!下面引用《Scala编程》上的解释
手动分割线****************************************************************************************
好了,如需转载请注明出处。 如有疑问,请留言