Mak*_*e42 2 dictionary scala language-concepts foldleft
我想知道foldLeft地图是如何工作的.如果我有一个List并使用零元素和函数调用foldLeft,我确实理解它是如何工作的:
val list1 = List(1,2,3)
list1.foldLeft(0)((a,b) => a + b)
Run Code Online (Sandbox Code Playgroud)
我0用第一个元素添加零元素list1然后添加第二个元素,list1依此类推.因此输出成为新输入,第一个输入是零元素.
现在我得到了代码
val map1 = Map(1 -> 2.0, 3 -> 4.0, 5 -> 6.2) withDefaultValue 0.0
val map2 = Map(0 -> 3.0, 3 -> 7.0) withDefaultValue 0.0
def myfct(terms: Map[Int, Double], term: (Int, Double)): Map[Int, Double] = ???
map1.foldLeft(map2)(myfct)
Run Code Online (Sandbox Code Playgroud)
Tuple2,但既然map2是a Map而不是a Tuple2,那么零元素是什么?List,即list1,我们总是"采取下一个元素list1".什么是"下一个元素map1?它是另一对map1吗?在这种情况下,您可以将a Map视为元组列表.你可以创建一个这样的列表:List(1 -> 2.0, 3 -> 4.0, 5 -> 6.2)并调用foldLeft它(这或多或少是完全正确的Map.foldLeft).如果您了解如何foldLeft使用列表,那么现在您也知道它如何与地图一起工作:)回答您的具体问题:
第一个参数foldLeft可以是任何类型.您也可以在第一个示例中传入map而不是int.它不必与您正在处理的集合的元素(尽管可能是)具有相同的类型,就像您在第一个示例中所拥有的那样,也不需要与集合本身的类型相同,就像您一样在最后一个例子中有它.考虑这个例子:
List(1,2,3,4,5,6).foldLeft(Map.empty[String,Int]) { case(map,elem) =>
map + (elem.toString, elem)
}
Run Code Online (Sandbox Code Playgroud)这产生了与之相同的结果list.map { x => x.toString -> x }.toMap.如你所见,这里的第一个参数是a Map,既不是List也不是Int.
传递给foldLeft的类型也是它返回的类型,以及传递的函数返回的类型.它不是"元素零".
foldLeft将该参数与列表的第一个元素一起传递给reducer函数.您的函数将组合这两个元素,并生成与第一个参数相同类型的新值.该值再次传入,第二个元素......等等.也许,检查签名foldLeft会有所帮助:
foldLeft[B](z: B)(op: (B, A) ? B): B
Run Code Online (Sandbox Code Playgroud)
这A是您的集合元素的类型,B可以是任何东西,唯一的要求是它出现的四个地方具有相同的类型.
这是另一个例子,它(几乎)相当于list.mkString(","):
List(1,2,3,4,5,6).foldLeft("") {
case("", i) => i.toString
case(s,i) => s + "," + i
}
Run Code Online (Sandbox Code Playgroud)
正如我在开头所解释的那样,这个上下文中的地图是一种列表(序列而非).就像我们处理列表时"我们总是采用列表的下一个元素"一样,在这种情况下我们将采用"地图的下一个元素".你自己说,地图的元素是元组,所以这就是下一个元素的类型:
Map("one" -> 1, "two" -> 2, "three" -> 3)
.foldLeft("") {
case("", (key,value)) => key + "->" + value
case(s, (key,value)) => s + ", " + key + "->" + value
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
3476 次 |
| 最近记录: |