应该广泛使用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实现的版本少了一行,它把参数列表声明和嵌套变量的提取合并成了一步,变得更加简洁和优雅。

bluishglc CSDN认证博客专家 CSDN博客专家
耿立超,架构师,CSDN博客专家,14年IT系统开发和架构经验,对大数据、企业级应用架构、SaaS、分布式存储和领域驱动设计有丰富的实践经验。对Hadoop/Spark 生态系统有深入和广泛的研究,参与过Hadoop商业发行版的开发,目前负责企业数据中台的架构设计和开发工作,热衷函数式编程,著有《大数据平台架构与原型实现:数据中台建设实战》https://item.jd.com/12677623.html 一书。
©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值