scala> val array = 1 to 10
array: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> array.reduce(_+_)
res4: Int = 55
reduce源码:
def reduce[A1 >: A](op: (A1, A1) => A1): A1 = reduceLeft(op)
参数是一个函数,这个匿名函数由两个类型一样的参数,以及一个和参数类型一样的返回值组成,其具体实现是由reduceLeft函数实现,
def reduceLeft[B >: A](op: (B, A) => B): B = {
if (isEmpty)
throw new UnsupportedOperationException("empty.reduceLeft")
var first = true
var acc: B = 0.asInstanceOf[B]
for (x <- self) {
if (first) {
acc = x
first = false
}
else acc = op(acc, x)
}
acc
}
这里可以看出,循环处理我们之前定义的array,第一次时只是返回1,就是我们输入的定义的Range中第一个元素,之后每次调用我们传入匿名函数,第一个参数值就是上次返回的值,第二参数值是Range中的循环值,(这里匿名函数我们传入(x:Int,y:Int) => x+y ,其功能就是简单的相加),这样就做到了累加的效果。
于是我们最原始的写法可以是:array.reduce((x:Int,y:Int) => x+y) 这样的,由于scala有类型的推断功能,于是我们可以进一步简化为:array.reduce((x,y) => x+y),根据scala占位符的语法:只要每个参数在函数中只出现一次,我们就可以用_来替代该参数。由于我们这个函数中,x和y都只出现一次,于是进一步简化:array.reduce(_+_),这就是我们的最终结果。