1. 归约函数
1.1 reduce
聚合: 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)
}
}
1.2 reduceLeft
从左往右,对集合中的元素执行算子
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)
1.3 reduceRight
从右往左,对集合中的元素执行算子
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)...))
2. fold、foldLeft 、foldRight
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)
}
}
本文介绍了Scala中的归约函数,包括reduce、reduceLeft和reduceRight。reduce通过两两聚合实现元素的综合计算,reduceLeft从左至右执行操作,reduceRight则从右至左。此外,还探讨了fold、foldLeft和foldRight的使用,它们用于将集合元素与初始值结合,实现聚合操作,foldLeft和foldRight分别按照从左到右和从右到左的顺序进行计算。
1154

被折叠的 条评论
为什么被折叠?



