一步一步理解Scala高階函數:
第一步:
Scala函數可以作為值,傳遞給另外一個變量,或者另外一個函數
語法特征: 必須要在函數后面加上空格和下划線
object FunctionOps1 { def main(args: Array[String]): Unit = { //作為值得函數
val sayBye = sayGoodBye _ //函數傳遞給變量空格和下划線
def say = sayGoodBye _ //函數傳遞給函數空格和下划線
sayGoodBye("zhangsan") sayBye("KPWong") say("laoli") } /** * 函數可以作為值,傳遞給另外一個變量,或者另外一個函數 * 語法特征: 必須要在函數后面加上空格和下划線 */ def sayGoodBye(name:String) : Unit = { println("Good bye to " + name) } }
第二步:匿名函數:
匿名函數:就是沒有名字的函數
Scala 中定義一個完整函數:
def functionName(Params):returnType = {body}
Scala中定義匿名函數:
(Params) => returnType //匿名函數定義
(Params) => {body} //匿名函數實現
問題:
該匿名函數如何被調用
解決方案:
將匿名函數賦值給一個變量或者函數
val sayAnonymousVal = (name:String) => { println("Good bye to " + name) } //匿名函數賦值給變量
def sayAnonymousFun = (name:String) => { println("Good bye to " + name) } //匿名函數賦值給函數
object FunctionOps1 { def main(args: Array[String]): Unit = { //作為值得函數
val sayBye = sayGoodBye _ //函數傳遞給變量
def say = sayGoodBye _ //函數傳遞給函數
sayGoodBye("zhangsan") sayBye("KPWong") say("laoli") sayAnonymousVal("laozhao") sayAnonymousFun("lao Fang") } /** * 函數可以作為值,傳遞給另外一個變量,或者另外一個函數 * 語法特征: 必須要在函數后面加上空格或者下划線 */ def sayGoodBye(name:String) : Unit = { println("Good bye to " + name) } //匿名函數:就是沒有名字的函數
/** * Scala 中定義一個完整函數: * def functionName(Params):returnType = {body} * Scala中定義匿名函數: * (Params) => returnType //匿名函數定義 * (Params) => {body} //匿名函數實現 * 問題: * 該匿名函數如何被調用 * 解決方案: * 將匿名函數賦值給一個變量或者函數 */ val sayAnonymousVal = (name:String) => { println("Good bye to " + name) } //匿名函數賦值給變量 def sayAnonymousFun = (name:String) => { println("Good bye to " + name) } //匿名函數賦值給函數 // def sayGoodBye(name:String) : Unit = { // println("Good bye to " + name) // }
}
第三步: 高階函數:帶函數參數的函數,一個函數的參數是函數,這種函數稱為高階函數
def HigheLevelFunction(name:String,func:(String) => Unit) :Unit = {
func(name)
}
使用高階函數:
HigheLevelFunction("LaoGao1",sayAnonymousVal)
HigheLevelFunction("LaoGao2",(name:String) =>sayAnonymousVal(name))
HigheLevelFunction("LaoGao3",(name:String) =>sayGoodBye(name))
HigheLevelFunction("LaoGaoAnonymous1",(name:String) =>{println(name)}) //更多情況下使用這一的匿名函數
//如果只有一個參數,可以省略掉()
HigheLevelFunction("LaoGaoAnonymous2",name=>println(name)) //更多情況下使用這一的匿名函數
//可以用通配符"_" 代替一個變量
HigheLevelFunction("LaoGaoAnonymous3",{println(_)})
//最簡單的寫法,通配符都可以省略
HigheLevelFunction("LaoGaoAnonymous4",println)