应该广泛使用case语句简化函数字面量的实现

这篇文章很短,但足以单独作为一篇文章存在,因为这里介绍的这个Scala编程技巧非常的实用和高效。

在Scala里我们需要大量地编写一些函数字面量作为参数传递给高阶函数,而很多时候,被要求提供的函数字面量的参数是一些复合类型,比如tuple,在函数字面量的实现体中,往往第一步就是通过模式匹配从复合类型中提取出嵌套的变量进行计算,例如下面计算元组两元素平方差的例子:

scala>   val xs = Seq((1,2),(3,4))
xs: Seq[(Int, Int)] = List((1,2), (3,4))

scala>   val xs1 = xs.map {
     |           tuple =>
     |                   val (num1, num2) = tuple
     |                   (num2 + num1) * (num2 - num1)
     |   }
xs1: Seq[Int] = List(3, 7)

在这个例子中我们使用的是常规的函数字面量的实现方式,但是更加“老道”的写法是使用case语句! 我们之前在介绍偏函数时提过使用case语句实现函数字面量: https://blog.csdn.net/bluishglc/article/details/50995939, 但是在偏函数之外的场景,我们似乎没有找到特别的理由去使用case语来实现一个函数字面量。

而实际上我们应该广泛地使用case语句去定义函数字面量,因为它确实有很多“额外”的好处,因为使用case定义函数字面量可以将参数列表声明与嵌套变量的提取合二为一,简化函数的实现!,上面的例子如果使用case语句实现将会是这样的:

scala>   val xs2 = xs.map {
     |           case ((num1, num2)) =>
     |                   (num2 + num1) * (num2 - num1)
     |   }
xs2: Seq[Int] = List(3, 7)

scala>   println(xs2)
List(3, 7)

我们可以清楚地看到,case实现的版本少了一行,它把参数列表声明和嵌套变量的提取合并成了一步,变得更加简洁和优雅。

你可能感兴趣的:(Scala语言)