1、值函數
將一個函數賦值給某個變量,此變量就是一個值函數
scala> import scala.math._
import scala.math._
fun: Double => Double = <function1>
scala> fun(25)
res19: Double = 5.0
2、匿名函數
無名稱的函數,即爲匿名函數,通常使用在函數的參數中
scala> (1 to 9).reduceLeft(_ + _)
res20: Int = 45
scala> (1 to 9).reduceLeft( (x:Int,y:Int) => x+y)
res21: Int = 45
3、高階函數
以函數做爲參數的函數就是高階函數
scala> def valueAtQuarter(fun: (Double) => Double) = fun(4)
valueAtQuarter: (fun: Double => Double)Double
scala> valueAtQuarter(scala.math.sqrt _)
res22: Double = 2.0
4、柯里化
將多個參數的函數分離,使其通過兩次調用,有點說不清楚,直接上代碼。。。
scala> def mul (x: Int,y: Int) = x * y
mul: (x: Int, y: Int)Int
scala> def mul(x : Int) = (y: Int) => x * y
mul: (x: Int)Int => Int
scala> val x=mul(6)
x: Int => Int = <function1>
scala> x(5)
res23: Int = 30
scala> mul(6)(5)
res24: Int = 30
說明:mul(6)(5)先執行mul(6)返回一個函數再調用(5)
scala> def mul(x: Int)(y: Int)= x *y
mul: (x: Int)(y: Int)Int
這種寫法比較容易理解,和def mul(x : Int) = (y: Int) => x * y等效
5、控制抽象
執行一個代碼塊的內容,可以定義一個無參無返回的函數
def runThread(block: () => Unit){
new Thread{
override def run() {block() }
}.start()
}
runThread( () => println("start");Thread.sleep(1000);println("end") )
飄紅部分可以省略,增加代碼可讀性
6、控制抽象與柯里化的結合實例
def until(condition: => Boolean)(block: =>Unit){
if(!condition){
block
until(condition)(block)
}
}
說明:condition: => Boolean等價condition: () => Boolean
block: =>Unit等價 block: () =>Unit