Scala中的fold和reduce理解

折叠 fold

折叠,也可以对集合数据进行简化 获取最终的一条结果

fold方法 可以传递2个部分的参数,第一个部分表示集合之外的数据

第二部分的参数表示数据进行的逻辑处理

源码 : 有 函数的柯里化
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
foldRight

源码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

fold折叠应用场景

将两个map进行合并 相同的key做累加 不同的key直接增加

理解代码 ☆☆☆☆☆:

map1.foldLeft(map2)((map, t) => {
     map(t._1) = map.getOrElse(t._1 , 0) + t._2
	 map
})

map1.foldLeft(map2)( (map, t) => {逻辑})

以map1为主体 遍历其中的内容 一个一个的

**map2整体是初始值 ** 所以放在第一个参数

根据代码提示,第二个参数 传的是一个 类型B 和 一个元组 返回的值是类型B

所以 传个 (map, t), 这里的map 和 t 初次的 值

map 初次值就是 初始值 map2 t的初始值就是map1遍历的第一个, 即 (a , 1)

所以 明确有值 t = (a, 1) 然后从初始值map中 找key为a的值 没有就是返回0 两个值相加作为k的新的v值 (这就是第二个参数的逻辑)

map保存的是每次两两操作的结果 map刚开始的值就是map2 说白了 map 就是中间值 (刚开始还要赋个初值)

而元组 t 就是map1的所有元组

因为map1有三个元祖 所以一共与map进行三次两两操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述




reduce 化简

(数据减少 不是结果变少(小))

将多个数据 通过一定逻辑 减少一些
在这里插入图片描述
比如 把四个变一个,

看上图 表示是 两两操作

先取 1  2       操作  结果 res1

然后	res1  3   操作 结果 res2

然后 res2 4     操作  结果 res3

最终结果 是 res3

下图 以操作为相加 示例:
在这里插入图片描述
即把集合中的数据两两相加变为1个 也看做 化简操作

求和 也可以用这样的方式 (也有sum函数可以完成求和操作 但是sum只能求和

但reduce里面的逻辑 是我们自己任意规定的 什么操作都可以 )


看源码 reduce 其实 调用的 reduceLeft 两者没有去别
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

reduceLeft 逻辑

很简单 :

first 标记变量 看是否是集合的第一个数

op 穿过来的操作函数 加 或 减

self 传过来的集合 (1, 2, 3, 4)

acc 定义时先转换类型 这里是Int类型, 它就是 每次两两操作的结果

在循环中,if里面就是第一次循环 将集合的第一个数给了acc

以后每次循环都进不了if

else 就是 两两操作结果 再返回给acc 再循环
在这里插入图片描述

reduceRight

使用reduceRight 减操作 不是 left的 -8 结果 而是 -2
在这里插入图片描述
源码: 将集合反转然后使用reduceLeft 然后注意逻辑 将x y 互换位置
在这里插入图片描述
逻辑:看注释
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值