你如何使用Map.foldLeft?根据文档,它看起来像是
foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B
但是我遇到了困难:
Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v )
出错指的是k前面的开括号。
你如何使用Map.foldLeft?根据文档,它看起来像是
foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B
但是我遇到了困难:
Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v )
出错指的是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
case
语句。 - Daniel C. Sobralvalues
或mapValues
绝对是最清晰的解决方案(这几乎总是正确选择)。 - Kevin Wright关键是使用部分函数作为代码块,换句话说,您需要添加一个匹配参数的 case
语句:
Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }
case
如何在没有match
关键字的情况下使用,它又是如何作为解构操作使用的? - NikolaS这并不是对你的问题的真正回答,但当我开始使用fold时,我发现它很有用,所以还是说一下吧!注意, /:
方法是 foldLeft
的“别名”,因为有两个原因可以更清晰:
xs.foldLeft(y) { (yy, x) => /* ... */ }
(y /: xs) { (yy, x) => /* ... */ }
y
被折叠到集合xs
中Tuple2
参数的顺序与"call"方法的顺序相同