首先看一个例子, 发现 /:
不知道是什么
点进去发现, /:
实际是foldLeft操作
def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this.seq foreach (x => result = op(result, x))
result
}
首先来看下 foldLeft
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this.seq foreach (x => result = op(result, x))
result
}
方法接收两个参数, z和op, 一个是B类型的参数z, 另一个是返回B类型的**函数**op 在看到这个trait其实是TraversableOnce,可迭代的集合。 def seq: TraversableOnce[A] 比如一个val listA = List(1,2,3) listA其实是实现了TraversableOnce这个trait的。 我们可以直接使用:
object TestFoldLeft {
def main(args: Array[String]): Unit = {
val listA = List(1, 2, 3)
val b = (10/:listA)(_+_)
val c = listA.foldLeft(10)(_+_)
println(b)
}
}
这个里面的10其实就是z返回值是Int类型即B类型 那么可以看出op这个函数返回值也需要是Int类型
可以看出
val result = z, 这里其实就是10,x=>result=op(result, x) ,
其实z就是返回值,this.seq在这里就是list,对list遍历,这里执行op函数。
这里我们执行的是_+_
,就是累加了10+1+2+3=16