Scala 基础(8)—— 占位符_和部分应用函数
1. 占位符 _
針對?Scala 基礎(7)—— 函數字面量和一等函數?中最后提到的,關于 filter 函數字面量的精簡寫法,可以使用占位符 _ 來代替。
占位符_,用來表示一個或者多個參數。(這里的多個參數不是表示一個下劃線代表多個參數,而是多個下劃線可以代表多個參數)
在函數字面量的表達中,可以將下劃線看成是“要填的空”,函數每次被調用時,這個“空”就回被一個參數“填”上。
例如:
def main(args: Array[String]): Unit = {val list = List(1, 2, 3)list.filter(x => x > 0)list.filter(_ > 0) // 與上面的調用是等價的}?
這種調用僅限于 Scala 編譯器能夠在編譯期間推斷出參數的類型。
當編譯器無法再編譯期間推斷參數類型,則必須顯式地給出參數類型。
例如:
def main(args: Array[String]): Unit = {// val sum = _ + _ // 編譯失敗val sum = (_: Int) + (_: Double)println(sum(1,2)) // 輸出3.0}?
?
2.? 部分應用函數
在使用下劃線時,本質上是在編寫一個部分應用函數(partially applied function)。
這里的意義在于:
當調用某個函數,傳入任何參數時,實際上是應用那個函數到這些參數上。
當然這種描述過于抽象,所以我們看下面的例子:
?
首先,定義一個方法 sum():
def sum(a: Int, b: Int, c: Int) = a + b + c顯然,這是一個計算三個整數和的方法。一般的調用方式如下:
val value = sum(1, 2, 3)?
以上是一個簡單的方法的調用,部分應用函數的功能,就是將 def 定義的方法,映射成函數值的形式。
例如:
val f = sum _ // f 是一個 (Int, Int, Int) => Int 類型的函數字面量以上,將方法映射成了一個??(Int, Int, Int) => Int 類型的函數字面量。
它的調用方式與方法類似,但是本質發生了改變:
val value = f(1, 2, 3)?
之所以稱為部分應用函數,是因為你并沒有把那個函數應用到所有的入參。
還是拿上面的例子做說明,可以通過給出一些必填的參數來表達一個部分應用函數:
val f = sum(1, _: Int, 2) // f 是一個 Int => Int 類型的函數字面量在這個例子中,部分應用函數給出了第一個和第三個參數,由于只缺失一個參數,編譯器將生成一個新的函數字面量,類型是 Int => Int。
?
部分應用函數的作用在于:
雖然不能將方法或嵌套的函數直接賦給某個變量,或者作為某個函數的入參,但是可以通過部分應用函數的方式,將其轉成一個函數值來完成這些操作。
最后需要說明的是,只有明確需要函數的地方,才能使用部分應用函數。
?
轉載于:https://www.cnblogs.com/jing-an-feng-shao/p/10301551.html
總結
以上是生活随笔為你收集整理的Scala 基础(8)—— 占位符_和部分应用函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP queue 的一些问题
- 下一篇: Spring框架IOC和AOP的实现原理