應該廣泛使用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實現的版本少了一行,它把參數列表聲明和嵌套變量的提取合併成了一步,變得更加簡潔和優雅。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章