你如何使用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+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