当前位置: 首页 > 工具软件 > ListFold > 使用案例 >

Scala折叠(fold)

景俊语
2023-12-01

折叠

  • 集合外部元素和集合内部元素进行合并

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集合中的元素进行合并。

分析

  • 两个不同的集合,用折叠。
  • 参数一个是元组,一个是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)
 类似资料: