2010-11-14 83 views
25

你如何使用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的前面開括號。

回答

66

如果你想使用(a, (k, v))語法,你可能需要通知編譯器使用模式匹配。

Map("first"->1, "second"->2).foldLeft(0){ case (a, (k, v)) => a+v } 

請注意,case聲明需要大括號。

16

我想,當你想到你不能做的元組的模式匹配:

Map("first"->1,"second"->2).foldLeft(0)((a, t) => a + t._2) 

其實用價值和總和簡單。

Map("first"->1,"second"->2).values.sum 
+6

他_can_的元組模式匹配。然而,爲了模式匹配,需要使用'case'。 – 2010-11-14 21:28:25

+1

對於這樣的問題,使用'values'或'mapValues'絕對是最明智的解決方案(它幾乎總是使它成爲正確的選擇) – 2010-11-15 09:22:06

5

這不是您的問題的答案,但我發現它在開始使用摺疊時非常有用,所以我會說它無論如何!注意/:法「別名」爲foldLeft可以有兩個原因再清楚不過了:

xs.foldLeft(y) { (yy, x) => /* ... */ } 

(y /: xs) { (yy, x) => /* ... */ } 

注意,在第二行:

  • 它更清楚,y正在價值折成集合xs
  • 您可以輕鬆記住Tuple2參數的排列順序與「調用」方法的排序方式相同
6

的技巧是使用的部分功能代碼塊,換句話說,你添加的參數相匹配的case聲明:

Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }