Scala的高階函式使用總結
阿新 • • 發佈:2019-02-16
函式在Scala語言中有著舉足輕重的地位,它和類,變數同樣屬於一等公民的地位,函式可以脫離類而獨立存在,同時自己也可以作為引數傳遞給其他函式。
匿名函式
scala> val sayHello = (name: String) => println("my name is:" + name)
sayHello: String => Unit = <function1>
scala> sayHello("cyony")
my name is:cyony
sayHello變數就是一個函式,它沒有自己的函式名,只定義了函式簽名,以及函式體,返回型別為Unit,可以看到編譯器自動為這個匿名函式取名為function1。在實際呼叫時,直接呼叫這個函式變數,傳入一個String型別的值,即可。
無返回高階函式
scala> val sayHello = (name: String) => println("my name is:" + name) sayHello: String => Unit = <function1> scala> sayHello("cyony") my name is:cyony scala> def introduce(fun: (String) => Unit, name: String, age: Int): Unit = { | println("my age is:"+age) | fun(name) | } introduce: (fun: String => Unit, name: String, age: Int)Unit scala> introduce(sayHello,"cyony",25) my age is:25 my name is:cyony
上面一步定義了匿名函式,且賦值給了sayHello變數。然後定義了一個introduce函式,他的簽名為,第一引數為一個方法,此fun的簽名為一個String變數,返回型別是Unit;第二個引數是一個String型別的變數;第三個引數是Int型別的變數。因為fun變數自己就是一個函式,且又傳給了introduce函式,所以稱fun為他的高階函式。在呼叫的時候,為fun傳入sayHello變數,最終列印結果如上所示。
有返回高階函式
scala> def introduce(age: Int) = (name: String) => println("my name is:" + name + ",my age is:" + age) introduce: (age: Int)String => Unit scala> val introduceFun = introduce(25) introduceFun: String => Unit = <function1> scala> introduceFun("cyony") my name is:cyony,my age is:25
這個例子和上面的相比,有點不同,introduce函式本身返回的也是一個函式,可以看到repl的提示,返回一個簽名為String,返回為Unit的匿名函式,函式主體則是列印那句話。在呼叫的時候,首先得到這個匿名函式,然後再呼叫這個匿名函式。這個匿名函式同樣是introduce的高階函式。
Currying函式
scala> def introduce(age: Int)(name: String) = println("my name is:" + name + ",my age is:" + age)
introduce: (age: Int)(name: String)Unit
scala> introduce(25)("cyony")
my name is:cyony,my age is:25
函式的currying化行為本質上也是一個高階函式:接受現有的函式,返回新函式。 這個例子就是對上一個例子的currying化操作。傳入第一個引數後返回一個函式,然後再傳入第二個引數,完成第二個函式。這樣就講一個高階函式拆解成兩個一階函式。
高階函式型別推斷
scala> def triple(fun: (Int) => Int, num: Int) = {
| fun(num)
| }
triple: (fun: Int => Int, num: Int)Int
scala> triple(_*3,5)
res12: Int = 15
如上所示,定義了一個triple函式,他的簽名是一個高階函式和一個整形。在這個函式實際使用的時候,用了佔位符來替換傳入引數,因為傳入的引數肯定是Int型別,且在此主體中只使用了一次,所以可以直接用佔位符表示,省去了函式簽名以及返回,直接定義主體,使得語法非常精簡。