今天在熟悉项目代码的时候,看到了代码中用到了foldLeft方法,说来惭愧,用scala写了一年spark都没有用到这个方法,太菜了。
以下均个人理解,可能不是很对,欢迎交流。
概念
从字面意思上看,fold是折叠,那么foldLeft应该是向左折叠,foldRight应该是向右折叠。
在scala中亦是如此。

先以foldLeft为例,泛型为B,第一个参数是B类型的值,第二个参数是一个返回值为B类型值的函数,返回值是B类型的值。
看看foldLeft中作为参数传入的函数(op: (B, A) => B),这个函数第一个参数是B类型,第二个参数是A类型,返回值是B类型。
foldLeft的第一个参数,会作为第二个参数所传入函数的B类型参数的默认值。
所以foldLeft其实就是把右边的A类型值向左折叠到左边的B类型值上,并返回作为下一轮的左侧。遍历完成后返回。
再看看foldRight,也是以第一个参数作为B类型的初始值,之后在第二个参数的函数中把左边的A右折叠到右边的B上,并返回作为下一轮的右侧。
需要注意的是,foldRight会先将集合翻转。
demo
foldLeft Demo
val list = List(1, 2, 3, 4, 5)
val res1 = list.foldLeft(0)((a, b) => {
a-b
})
println(res1)
res1的值是-15。
过程如下:0作为a的初始值,向左折叠
a b 运算
0 1 0-1=-1
-1 2 -1-2=-3
-3 3 -3-3=-6
-6 4 -6-4=-10
-10 5 -10-5=-15
-15
foldRight Demo
val list = List(1, 2, 3, 4, 5)
val res2 = list.foldRight(0)((a, b) => {
a-b
})
println(res2)
res2的值是3。
过程如下:0作为b的初始值,翻转列表,向右折叠
a b 运算
1 0 1-0=1
2 1 2-1=1
3 1 3-1=2
4 2 4-2=2
5 2 5-2=3
3
总结
def foldLeft[B](z: B)(op: (B, A) => B): B
def foldRight[B](z: B)(op: (A, B) => B): B
根据参数类型来区分较为清晰,好理解。
foldLeft:z作为B类型初始值,之后将右边的A类型折叠到左边B类型,循环计算,返回左边B类型。
foldRight:先翻转集合,将z作为B类型初始值,之后将左边的A类型折叠到右边B类型,循环计算,返回右边B类型。
个人理解,欢迎交流。
本文介绍了 Scala 中的 foldLeft 和 foldRight 方法。foldLeft 从左侧开始,将元素逐个与初始值结合,最终返回左侧结果;foldRight 则先翻转集合,然后从右侧开始折叠,最后返回右侧结果。通过示例演示了它们的具体使用,有助于理解这两个方法的工作原理。
1062

被折叠的 条评论
为什么被折叠?



