Scala的三个变量的映射函数

时间:2017-08-16 17:37:49

标签: scala

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}

2 个答案:

答案 0 :(得分:3)

case thingy实际上是PartialFunction的语法。您可以拥有多个这样的子句:

 l.map { 
   case 1 => "one"
   case 2 => "two"
   case _ => "foo"
 }

这实际上会将PartialFunction传递给map,而不仅仅是Function,但这有效,因为PartialFunctionFunction的子类。 生成的PartialFunction在这些参数上定义,由case子句匹配,而不是在其他参数上匹配:

l.collect { 
   case 1 => "one"
   case 2 => "two"
}

返回List("one", "two")

您也可以使用case来解构元组或案例类(或其他任何具有unapplyunapplySeq的内容),如其他答案所指出的那样,就像您在一个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 }