我有以下代码:
val xs = List(('a', 1), ('a', 2), ('b', 3), ('b', 4))
我想把它转换成 map 。例如
Map('a' -> Seq(1,2), 'b' -> Seq(3,4))
.所以我继续编写转换:xs.groupBy(_._1) map {
case (k, v) => (k, v.map(_._2))
}
为什么map后面的大括号需要是
{
.当我开始时,我认为我可以做到以下几点:xs.groupBy(_._1).map(case (k, v) => (k, v.map(_._2)))
但这不能编译。
最佳答案
因为 .map method accepts a function
你实际上写的是
map({
case (k, v) => (k, v.map(_._2))
})
和
{ case (k, v) => (k, v.map(_._2)) }
是模式匹配匿名函数( SLS ,第 8.5 节)的快捷方式定义,即 one of the function kinds :val isOdd: PartialFunction[Int, String] = {
case x if x % 2 == 1 => x+" is odd"
}
val upcastedIsOdd: Function[Int, String] = {
case x if x % 2 == 1 => x+" is odd"
}
您不能省略大括号(因此您将失去部分功能和模式匹配的 nicity),但您可以跳过普通大括号(并仍然保留部分功能),就像在下面的代码段中一样:
scala> List(1,2,3).take(1)
//res0: List[Int] = List(1)
scala> List(1,2,3) take 1
//res1: List[Int] = List(1)
关于scala - 在 Scala 中使用 case 语句破坏元组的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13131568/