关于使用案例语句破坏Scala元组的规则



我有以下代码:

val xs = List(('a', 1), ('a', 2), ('b', 3), ('b', 4))

我想将其转换为地图。例如Map('a' -> Seq(1,2), 'b' -> Seq(3,4))。所以我继续写转换:

xs.groupBy(_._1) map {
  case (k, v) => (k, v.map(_._2))
}

为什么地图之后的支撑需要为{。当我开始时,我认为我可以做以下操作:

xs.groupBy(_._1).map(case (k, v) => (k, v.map(_._2)))

但这不会编译。

因为.map方法接受函数

您实际写的是

map({
  case (k, v) => (k, v.map(_._2))
})

{ case (k, v) => (k, v.map(_._2)) }是匹配匿名函数(SLS,§8.5)的模式的快捷定义,这是函数类型之一:

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"
}

您不能使用卷曲括号(因此您会失去部分功能并匹配匹配的良好),但是您可以像下面的摘要一样跳过普通括号(并且仍然保留部分功能):

scala> List(1,2,3).take(1)
//res0: List[Int] = List(1)
scala> List(1,2,3) take 1
//res1: List[Int] = List(1)

似乎真正的问题是什么时候可以使用括号(代替括号{代表匿名函数。我建议看看丹尼尔·索布拉尔(Daniel Sobral)对这个问题的回答:牙套和括号之间的鳞片形式差异是什么,什么时候应该使用?

最新更新