1. 程式人生 > >Scala的高階函式使用總結

Scala的高階函式使用總結

    函式在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型別,且在此主體中只使用了一次,所以可以直接用佔位符表示,省去了函式簽名以及返回,直接定義主體,使得語法非常精簡。