7

我有以下代码:

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

为什么 map 后面的大括号必须是{. 当我开始时,我认为我可以做到以下几点:

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

但这不编译。

4

2 回答 2

12

因为 .map方法接受一个函数

你实际上写的是

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

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

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)
于 2012-10-30T00:34:24.770 回答
2

这里真正的问题似乎是什么时候可以使用括号(代替大括号{来表示匿名函数。我建议看一下 Daniel Sobral 对这个问题的回答Scala 中大括号和圆括号之间的形式区别是什么,什么时候应该使用它们?

于 2012-10-30T22:13:58.047 回答