大數據Spark蘑菇雲行動前傳第12課:Scala函數式編程(匿名函數、高階函數、函數類型推斷、Currying)

package com.dtspark.scala.basics

/**
 * 函數式編程進階:
 * 1,函數和變量一樣作爲Scala語言的一等公民,函數可以直接賦值給變量;
 * 2, 函數更長用的方式是匿名函數,定義的時候只需要說明輸入參數的類型和函數體即可,不需要名稱,但是如果你
 *要使用的話,一般會把這個匿名函數賦值給一個變量(其實是val常量),Spark源碼中大量存在這種語法,必須掌握;
 * 3, 函數可以作爲參數直接傳遞給函數,這極大的簡化的編程的語法,爲什麼這樣說呢?原因非常簡單:
 *    第一:以前Java的方式是new出一個接口實例,並且在接口實例的回調方法callback中來實現業務邏輯,現在
 *是直接把回調方法callback傳遞給我的函數,且在函數體中直接使用,這毫無疑問的簡化的代碼的編寫,提升了開發效*率;
 *    第二:這種方式非常方便編寫負責的業務邏輯和控制邏輯,對於圖計算、機器學習、深度學習等而言至關重要;
 *    
 *    函數作爲函數的參數傳遞的編程方式是稱之爲高階函數的編程方式,Spark源碼和應用程序開發中至少60%都是
 *這種代碼,必須務必一定要掌握。
 * 4, 函數式編程一個非常強大的地方之一在於函數的返回值可以是函數,當函數的返回類型是函數的時候,這個時候
 *就表明Scala的函數實現了閉包!
 *    Scala閉包的內幕是:Scala的函數背後是類和對象,所以,Scala的參數都作爲了對象的成員!!!!!!,
 *所以後續可以繼續訪問,這就是Scala
 *    實現閉包的原理內幕!
 * 
 * 5, Currying, 複雜的函數式編程中經常使用,可以維護變量在內存中的狀態,且實現返回函數的鏈式功能,可以
 *實現非常複雜的算法和邏輯;
 */
object functionalProgramming {
  def main(args: Array[String]): Unit = {
    /**
     * 1,函數和變量一樣作爲Scala語言的一等公民,函數可以直接賦值給變量;
     */
    val hiData = hiBigData _
    hiData("Spark")
    
    /**
     * 2, 函數更長用的方式是匿名函數,定義的時候只需要說明輸入參數的類型和函數體即可,不需要名稱,但是如
     *果你要使用的話,一般會把這個
     *    匿名函數賦值給一個變量(其實是val常量),Spark源碼中大量存在這種語法,必須掌握;
     */
    val f = (name: String) => println("Hi, " + name)
    f("Kafka")
    
    
    /**
     * * 3, 函數可以作爲參數直接傳遞給函數,這極大的簡化的編程的語法,爲什麼這樣說呢?原因非常簡單:
     *     第一:以前Java的方式是new出一個接口實例,並且在接口實例的回調方法callback中來實現業務邏輯,      *現在是直接把回調方法callback傳遞給我的函數,且在函數體中直接使用,這毫無疑問的簡化的代碼的編寫,提     *升了開發效率;
     *    第二:這種方式非常方便編寫負責的業務邏輯和控制邏輯,對於圖計算、機器學習、深度學習等而言至關重      *要;
     *    
     *    函數作爲函數的參數傳遞的編程方式是稱之爲高階函數的編程方式,Spark源碼和應用程序開發中至少          *60%都是這種代碼,必須務必一定要掌握。
     */
    def getName(func: (String) => Unit, name: String){
      func(name)
    }
    getName(f,"Scala")
    
   Array(1 to 10: _*).map { (item: Int) => 2 * item }.foreach { x => println(x) }
   
   
   /**
    *  4, 函數式編程一個非常強大的地方之一在於函數的返回值可以是函數,當函數的返回類型是函數的時候,這個
    *時候就表明Scala的函數實現了閉包!
    *   Scala閉包的內幕是:Scala的函數背後是類和對象,所以,Scala的參數都作爲了對象的成員!!!!!
    *!,所以後續可以繼續訪問,這就是Scala
    *   實現閉包的原理內幕!
    */
   def funcResult(message: String) = (name: String) => println(message + " : " + name)
   //def funcResult(message: String, name: String){println(message + " : " + name)}
   
   funcResult("Hello")("Java")  //Currying函數寫法, 必須掌握這種寫法,只要是複雜的Scala函數式編
                                //程代碼就一定會使用這種寫法
   val result = funcResult("Hello")
   result("Java")
  }
  
  def hiBigData(name: String){
    println("Hi, " + name)
  }
}

Hi, Spark

Hi, Kafka

Hi, Scala

2

4

6

8

10

12

14

16

18

20

Hello : Java

Hello : Java


該課程筆記來源於;wKiom1en2vyx6TZOAABgT3ptiDQ241.jpg-wh_50

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章