为什么在函数args中使用case更好地在map函数中进行模式匹配

Eug*_*eMi 3 scala

Scala 备忘单说"在函数args中用例进行模式匹配".因此

GOOD (xs zip ys) map { case (x,y) => x*y }
BAD (xs zip ys) map( (x,y) => x*y )
Run Code Online (Sandbox Code Playgroud)

为什么前者更好?

Tra*_*own 5

(x, y) => x * y 是以下的语法糖(我假设我们正在谈论整数):

new Function2[Int, Int, Int] {
  def apply(x: Int, y: Int): Int = x * y
}
Run Code Online (Sandbox Code Playgroud)

map在集合上需要一个A => B(这与desugars Function1[A, B]),这是一个完全不同的类型Function2.因此,在您的示例中不使用后一版本的一个很好的理由是编译器不会接受它.

如果你有一个实际需要的方法Function2,你可以使用:

scala> val pair = (List(1, 2, 3), List(4, 5, 6))
pair: (List[Int], List[Int]) = (List(1, 2, 3),List(4, 5, 6))

scala> pair.zipped.map { (x, y) => x * y }
res0: List[Int] = List(4, 10, 18)

scala> pair.zipped.map { case (x, y) => x * y }
res1: List[Int] = List(4, 10, 18)
Run Code Online (Sandbox Code Playgroud)

case版本的工作原理是编译器支持函数文字语法中的模式匹配Function2.一般来说,我个人更喜欢它的工作时(x, y) => x * y语法(即,当你的方法需要一个,你不需要做任何其他模式匹配).Function2