地图与列表的scala map函数

时间:2016-10-19 07:23:54

标签: scala

摘录1:

val l = List(1,2,43,4)
l.map(i => i *2)

摘录2:

val s = "dsadadaqer12"
val g = s.groupBy(c=>c)
g.map  ( {case (c,s) => (c,s.length)})

在代码段#2中,语法不同于#1,即需要花括号 - 为什么? 我认为以下内容会编译,但它不会:

g.map ( (c,s) => (c,s.length))

有人可以解释原因吗?

由于

2 个答案:

答案 0 :(得分:4)

两者之间的区别是 - 后者使用模式匹配而前者不使用

语法g.map({case (c,s) => (c,s.length)})只是语法糖:

g.map(v => v match { case (c,s) => (c,s.length) })

这意味着:我们命名我们的匿名函数v的输入参数,然后在函数 body 中我们将它与元组(c,s)匹配。由于这非常有用,Scala提供了您使用的速记版本。

当然 - 这与您使用地图还是列表无关 - 考虑以下所有可能性:

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都可以使用这两种语法选项,主要取决于您实际想要做什么。

答案 1 :(得分:1)

1- g.map{case (c,s) => (c,s.length)}

2- g.map((c,s) => (c,s.length))

map方法从g集合中提取单个参数,一个2元组。第一个示例编译,因为case语句使用模式匹配来提取元组的元素,而第二个示例没有,它将不会编译。为此,您必须执行以下操作:g.map(t => (t._1, t._2.length))

对于括号与花括号:“部分函数”一直需要括号,这就是case语句的含义。您可以使用大括号或括号来表示匿名函数(即x => ...),但如果函数多于一行(即有回车符),则需要使用大括号。

我在某个地方读到了这个parens / braces的区别可能会放松,但我不知道这是否会在短期内发生。