两者的区别在于——后者使用Pattern Matching而前者不使用。
g.map({case (c,s) => (c,s.length)}) 的语法只是语法糖:
g.map(v => v match { case (c,s) => (c,s.length) })
这意味着:我们将匿名函数的输入参数命名为v,然后在函数body中将其匹配到一个元组(c,s)。由于这非常有用,Scala 提供了您使用的速记版本。
当然 - 这与您使用 Map 还是 List 没有任何关系 - 请考虑以下所有可能性:
scala> val l = List(1,2,43,4)
l: List[Int] = List(1, 2, 43, 4)
scala> l.map({ case i => i*2 })
res0: List[Int] = List(2, 4, 86, 8)
scala> val l2 = List((1,2), (3,4))
l2: List[(Int, Int)] = List((1,2), (3,4))
scala> l2.map({ case (i, j) => i*j })
res1: List[Int] = List(2, 12)
scala> val g = Map(1 -> 2, 3 -> 4)
g: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4)
scala> g.map(t => t._1 * t._2)
res2: scala.collection.immutable.Iterable[Int] = List(2, 12)
Map 和 List 都可以使用这两种语法选项,这主要取决于您实际想要做什么。