scala foldLeft foldRight

本文介绍了 Scala 中的 foldLeft 和 foldRight 方法。foldLeft 从左侧开始,将元素逐个与初始值结合,最终返回左侧结果;foldRight 则先翻转集合,然后从右侧开始折叠,最后返回右侧结果。通过示例演示了它们的具体使用,有助于理解这两个方法的工作原理。

今天在熟悉项目代码的时候,看到了代码中用到了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类型。


个人理解,欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值