Scala简化|归约reduce方法源码解析

作用

  • 将同一集合中的元素进行聚合。
val list1: List[Int] = List(1, 2, 3, 4, 5, 6)
println(list1.reduce(_ + _))	// 21
// reduce底层调用的是reduceLeft,从左到右,两两元素进行聚合
println(list1.reduce(_ - _))    // -19

println(list1.reduceRight(_ - _))   // -3

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。

猜你喜欢

转载自blog.csdn.net/FlatTiger/article/details/114597982