作用
val list1: List[Int] = List(1, 2, 3, 4, 5, 6)
println(list1.reduce(_ + _))
println(list1.reduce(_ - _))
println(list1.reduceRight(_ - _))
reduce和reduceLeft
- reduce底层调用的就是reduceLeft,集合中各元素从左至右依次两两聚合。
- 在上面的例子中,list1.reduce(_ + _)的运行过程即为:
=> ( ( ( ( 1+2 ) + 3 ) + 4 ) + 5 ) + 6
reduceRight
- 首先我们看一下reduceRight的源码:
- 执行list1.reduceRight(_ - _),首先我们的集合不是空集合,接着判断我们的集合尾部元素是否为空,第一次执行很明显非空,所以第一次执行的是op(head, tail.reduceRight(op)),即1 - op(List(2,3,4,5,6))
- 第二次执行,同样做出如上判断,即1 - ( 2 - ( List(3,4,5,6) ) )。
- 第三次执行,同样的,1 - (2 -(3 -(List(4,5,6))))。
- …
- 直到第五次执行,得到1 -(2 - (3 -(4 -(5 - op(List(6)) ))))。
- 第六次,tail.isEmpty为true,这时返回head,即1 -(2 - (3 -(4 -(5 - 6 ) ))))= -3。