1. foldLeft
查看源码:
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this.seq foreach (x => result = op(result, x))
result
}
此处解析:
入参为两个 (z: B) 和 op: (B, A) => B 即: 一个任意类型的 z 和 一个匿名函数 op
再看将 z赋值给 result 并传进了 op的匿名函数 中原本的 B ,由此可以理解为 匿名函数op中的入参 B 的初始值就是Z , 又由this.seq知道 对调用者 进行foreach,使用变量x ,而x的值得,又赋给了 op函数中原本 的 A ,由此可知 A 就是调用者 比如
list.foldLeft()(){}
那么 list 就是 入参的 op: (B, A) 中的 A 并由返回值为result做出总结:
定义2个入参 一个为 初始化参数 z ,和一个 函数 op,函数的入参是 初始化参数 z和 调用者本身
,使得 初始化参数z在函数 op的循环迭代下 得到累加值
代码举例:
object FoldLeft {
def main(args: Array[String]): Unit = {
/**
* 示例一, 将map中的数据添加到另一个map中,注意需要一个可变的Map
* 或者导包: import scala.collection.mutable.Map
*/
val map1 = scala.collection.mutable.Map[String,String]("1" -> "LSIA", "2" -> "LINDA")
val map2 = Map("3" -> "lisa", "5" -> "puo")
var map = map2.foldLeft(map1)((a, b) => {
//a是聚合值,b.map2中一个对象
val key: String = b._1
val count: String = b._2
//合并数据
a += key -> count
}).foreach(x=>println(x))
/**
* 示例二, 计算数字和
*/
val i= 0 until(10) //Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
println(i)
val a=0
val sum= i.foldLeft(a)((x,y)=>{
x+y
})
println(sum) // 45
}
}