Scala實戰高手****第12課:Scala函數式編程進階(匿名函數、高階函數、函數類型推斷、Currying)與Spark源碼鑑賞

/**
 * 函數式編程進階:
 * 一、函數和變量同樣做爲Scala語言的一等公民,函數能夠直接賦值給變量
 * 二、函數更經常使用的方式是匿名函數,定義的時候只須要說明輸入參數的類型和函數體便可,不須要名稱,
 * 通常會把它賦值給變量,在Spark源碼中大量存在
 * 三、函數能夠做爲參數直接傳遞給函數,極大的簡化了編程代碼,在Java中須要經過callback來實現
 * 這樣的功能
 * 四、當函數的返回類型是函數的時候,這就代表Scala函數實現了閉包,Scala函數實際上是類和對象,
 * 因此,Scala的參數都做爲了對象的成員!!!
 * 五、Scala柯里化能很好的實現鏈式功能
 */編程

一:Scala函數編程進階
 
一、函數賦值給變量
 
    //把函數賦值給變量
    val f = bigData _
    f("Spark") //變量f其實也變成了函數
 
  def bigData(name: String): Unit = {
    println("Hi, " + name)
 
  }
 
二、匿名函數定義
 
    //匿名函數
    val fun = (name: String) => println("Hi, " + name)
    fun("Kafka")
 
三、將函數傳遞給方法
 
    //將函數傳遞給方法
    def getName(func: String => Unit, name: String) = func(name)
    getName(fun, "Scala")
 
    //map中其實也是個函數,map(item=>item*2)
    Array(1 to 10: _*).map(_ * 2).foreach(println)
 
四、Currying定義
 
    def funcResult(message: String) = (name: String) => println(message + ": " + name)
    //funcResult("Java") //這樣返回的是函數
    funcResult("Hello")("Java") //Currying函數寫法
    //等同於
    val result = funcResult("Hello")
    result("Java")
相關文章
相關標籤/搜索