你如何使用Map.foldLeft?按照docs它看起来像斯卡拉foldLeft在地图上
foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B
,但我有困难:
Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v)
error: not a legal formal parameter
错误指向k的前面开括号。
你如何使用Map.foldLeft?按照docs它看起来像斯卡拉foldLeft在地图上
foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B
,但我有困难:
Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v)
error: not a legal formal parameter
错误指向k的前面开括号。
如果你想使用(a, (k, v))
语法,你可能需要通知编译器使用模式匹配。
Map("first"->1, "second"->2).foldLeft(0){ case (a, (k, v)) => a+v }
请注意,case
声明需要大括号。
我想,当你想到你不能做的元组的模式匹配:
Map("first"->1,"second"->2).foldLeft(0)((a, t) => a + t._2)
其实用价值和总和简单。
Map("first"->1,"second"->2).values.sum
这不是您的问题的答案,但我发现它在开始使用折叠时非常有用,所以我会说它无论如何!注意/:
法“别名”为foldLeft
可以有两个原因再清楚不过了:
xs.foldLeft(y) { (yy, x) => /* ... */ }
(y /: xs) { (yy, x) => /* ... */ }
注意,在第二行:
y
正在价值折成集合xs
Tuple2
参数的排列顺序与“调用”方法的排序方式相同的技巧是使用的部分功能代码块,换句话说,你添加的参数相匹配的case
声明:
Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }
他_can_的元组模式匹配。然而,为了模式匹配,需要使用'case'。 – 2010-11-14 21:28:25
对于这样的问题,使用'values'或'mapValues'绝对是最明智的解决方案(它几乎总是使它成为正确的选择) – 2010-11-15 09:22:06