如上所述,foldLeft
操作的签名如图所示:
foldLeft[B](z: B)(op: (B, A) ⇒ B): B
操作的结果类型是B
。所以,这回答了你的第一个问题:
所以我这里的第一个元素是 Tuple2,但是由于 map2 是 Map 而不是 Tuple2,那么零元素是什么?
零元素是您想要从foldLeft
. 它可以是一个Int
或一个Map
或任何其他的东西。
op
在函数签名(即第二个参数)中,您希望如何对 map1 的每个元素进行操作,它是一(key,value)
对,或者另一种写法是key -> value
.
让我们尝试通过更简单的操作构建它来理解它。
val map1 = Map(1 -> 1.0, 4 -> 4.0, 5 -> 5.0) withDefaultValue 0.0
val map2 = Map(0 -> 0.0, 3 -> 3.0) withDefaultValue 0.0
// Here we're just making the output an Int
// So we just add the first element of the key-value pair.
def myOpInt(z: Int, term: (Int, Double)): Int = {
z + term._1
}
// adds all the first elements of the key-value pairs of map1 together
map1.foldLeft(0)(myOpInt) // ... output is 10
// same as above, but for map2 ...
map2.foldLeft(0)(myOpInt) // ... output is 3
现在,通过使用零z
元素z
(
val map1 = Map(1 -> 1.0, 4 -> 4.0, 5 -> 5.0) withDefaultValue 0.0
val map2 = Map(0 -> 0.0, 3 -> 3.0) withDefaultValue 0.0
// Here z is a Map of Int -> Double
// We expect a pair of (Int, Double) as the terms to fold left with z
def myfct(z: Map[Int, Double], term: (Int, Double)): Map[Int, Double] = {
z + term
}
map1.foldLeft(map2)(myfct)
// output is Map(0 -> 0.0, 5 -> 5.0, 1 -> 1.0, 3 -> 3.0, 4 -> 4.0)
// i.e. same elements of both maps concatenated together, albeit out of order, since Maps don't guarantee order ...
当我们有一个 List,即 list1 时,我们总是“取 list1 中的下一个元素”。“map1 中的下一个元素是什么?是另一对 map1 吗?”
是的,它(k,v)
是map1
.