Scala map
上的以下三个List
函数调用都产生了相同的结果。
有人可以告诉我它们的实际不同之处吗?
val l = List(1,2,3,4,5,6,7,8)
l.map(x => x * 2)
l.map{x => x * 2}
l.map{case x => x * 2}
答案 0 :(得分:3)
case
thingy实际上是PartialFunction
的语法。您可以拥有多个这样的子句:
l.map {
case 1 => "one"
case 2 => "two"
case _ => "foo"
}
这实际上会将PartialFunction
传递给map
,而不仅仅是Function
,但这有效,因为PartialFunction
是Function
的子类。
生成的PartialFunction
在这些参数上定义,由case
子句匹配,而不是在其他参数上匹配:
l.collect {
case 1 => "one"
case 2 => "two"
}
返回List("one", "two")
您也可以使用case
来解构元组或案例类(或其他任何具有unapply
或unapplySeq
的内容),如其他答案所指出的那样,就像您在一个match
表达式。
答案 1 :(得分:2)
l.map{case x => x * 2}
只是语法糖:
l.map(input => input match { case x => x * 2 })
这意味着 - 我们在传递给map
的匿名函数的输入参数上使用模式匹配(使用单个案例)。
显然,在这种情况下,模式匹配不会做太多(匹配所有内容,并且不会发生“取消应用”),但可以很容易地看出这在其他场合如何有用,例如“分手” “元组:
val l: Seq[(Int, Int)] = Seq((1, 2), (3, 4))
l.map { case (a, b) => a + b }