折叠
fold
- 底层调用的是foldLeft,从左向右折叠。
- 要求两个集合外的参数类型和集合内的参数类型必须一致。
val list1: List[Int] = List(3, 5, 9, 10, 11)
//println(list1.fold(10)(_ + _)) //48
println(list1.fold(6)(_ - _)) //-32
foldLeft
- 从左向右折叠。
- 集合外的参数类型和集合内的参数类型可以不一样。
println(list1.foldLeft(6)(_ + _)) //44
foldRight
- 从右向左折叠。
- 集合外的参数类型和集合内的参数类型可以不一样。
- foldRight就是逆序集合,然后调用foldLeft。
println(list1.foldRight(6)(_ - _)) //2
案例
分析
- 两个不同的集合,用折叠。
- 参数一个是元组,一个是map类型,所以用foldLeft|foldRight。
实现
val map1: mutable.Map[String, Int] = mutable.Map("a" -> 1, "b" -> 2, "c" -> 3)
val map2: mutable.Map[String, Int] = mutable.Map("a" -> 2, "b" -> 3, "d" -> 4)
val res = map1.foldLeft(map2) { (m2, kv) => {
val k: String = kv._1
val v: Int = kv._2
// 判断map2是否有这个key,有就取出来对应的v和map1的v相加,没有就是0
m2(k) = m2.getOrElse(k, 0) + v
m2
}
}
val res2: mutable.Map[String, Int] = map2.foldLeft(map1) { (m1, kv) => {
val k: String = kv._1
val v: Int = kv._2
m1(k) = m1.getOrElse(k, 0) + v
m1
}
}
println(res2)