聚合: N -> 1
,如 sum函数统计List中所有元素的和; 在scala底层采用两两聚合,聚合结果的类型与reduce方法的返回值类型相同
object T27 {
def main(args: Array[String]): Unit = {
val dataList = List(1, 2, 3, 4,5)
val i = dataList.reduce(_ - _)
println(i)
}
}
从左往右
,对集合中的元素执行算子
object T28 {
def main(args: Array[String]): Unit = {
val dataList = List(1, 2, 3, 4,5)
val i = dataList.reduceLeft(_ - _)
println(i)
}
}
注:运算逻辑为( ( ( (1 - 2) - 3) - 4) - 5)
,即 op( op( ... op(x_1, x_2) ..., x_{n-1}), x_n)
从右往左
,对集合中的元素执行算子
object T29 {
def main(args: Array[String]): Unit = {
val dataList = List(1, 2, 3, 4, 5)
val i = dataList.reduceRight(_ - _)
println(i)
}
}
注:运算逻辑为(1 - (2 - (3 - (4 - 5) ) ) )
,即 op(x_1, op(x_2, ..., op(x_{n-1}, x_n)...))
fold函数的本质是用初始值和集合内的每一条数据进行聚合
;fold方法实际是函数柯里化
,有2个参数,第一个参数表示初始值
,第二个参数表示计算规则
。fold方法有两个变体:foldLeft()和foldRight()
:foldLeft(),第一个参数为累计值
,集合遍历的方向是从左到右
;foldRight(),第二个参数为累计值
,集合遍历的方向是从右到左
如:合并2个map并key相同的求和
object T30 {
def main(args: Array[String]): Unit = {
val map1 = mutable.Map("a" -> 1, "b" -> 1, "c" -> 3)
val map2 = mutable.Map("a" -> 1, "d" -> 1, "c" -> 3)
map1.foldLeft(map2)((map, element) => {
val k = element._1
val v = element._2
val newV = map.getOrElse(k, 0) + v
map.update(k, newV)
map
})
println(map2)
}
}