1. 程式人生 > 實用技巧 >Scala 高階函式

Scala 高階函式

一步一步理解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)