开发者学堂课程【Scala 核心编程 - 进阶:折叠的基本介绍和使用】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9055
折叠的基本介绍和使用
内容介绍
一、基本介绍
二、应用案例
一、基本介绍
fold 函数将上一步返回的值作为函数的第一个参数继续传递参与运算直到 list 中的所有元素被遍历。
1.可以把 reduceLeft 看做简化版的 foldLeft 也就是说foldLeft更加强大。
为什么呢?我们看reduceLeft 底层代码,但是我们也可以在源码上追加
def reduceLeft[B>:A] (@deprecatedName(‘f)op:(B,A)=>B):B=
if (isEmpty) throw new UnsupportedOperationaException(“empty.reduceLeft”)
Else tail foldLeft[B](head)(op)
这里就用到了 foldLeft,这两个区别在什么呢
reduceLeft跟这个折叠最大的区别是,我们这个向左折叠他会首先有一个同,然后传入折叠的具体函数
如何理解:
def reduceleLeft[B>A](@deprecatedName(‘f)op:(B,A):B =if (isEmpty) throw new UnspportedOper ationException (“empty、 reduceLeft”) else tail.foldLeft[B](head)(op)
可以看到 reduceLeft 就是调用的 foldLeft[B](head),并且是默认从集合head 元素开始操作的.
2.相关函数:fold、foldLeft、foldRight,可以参考 reeduce 的相关方法理解
二、应用案例
Object FoldDemo01{
Def main (args;Array[string]:Unit={
Val list=List(1,2,3,4)
Def=minus(num:Int,num2:Tnt):Tnt={num1-num2}
//说明
//1、折叠的理解化和化简的运行机制几乎一样.
//理解
List,foldLeft(5)(minus)理解成
List(5,1,2,3,4)List reduceLeft(minus)
//步骤(5-1)
//步骤((5-1)-2)
//步骤(((5-1)-2)-3)
//步骤((((5-1)-2)-3))-4=-5
Drinln (list,foldLeft(5)(minus))//函数柯里化
////理解 Liet,foldList(5)(minus)理解成List(1,2,3,4,5)
List,reduceRight(minus)
//步骤(4-5)
//步骤(3-(4-5)
//步骤(2-(3-(4-5)))
//步骤1-(2-(3-(4-5)))=3
PintLn(List、foldRight(5)(minus))//