我有以下代码:
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)对这个问题的回答:牙套和括号之间的鳞片形式差异是什么,什么时候应该使用?