1. 程式人生 > >Spark函數式編程進階

Spark函數式編程進階

並且 直接 back ava 疑問 object 應用程序 message new

函數式編程進階

1、函數和變量一樣作為Scala語言的一等公民,函數可以直接復制給變量;

2、函數更長用的方式是匿名函數,定義的時候只需要說明輸入參數的類型和函數體即可,不需要名稱,但是匿名函數賦值給一個變量(其實是val常量),Spark源碼中大量存在這種語法;

3、函數可以作為參數直接傳遞給函數,這極大地簡化的編程語法;

4、函數式編程一個非常強大的地方之一在於函數的返回值可以是函數,當函數的返回類型是函數的時候,這個時候就是表明Scala的函數是實現了閉包!

Scala壁報的內幕是:Scala的函數背後是類和對象,所以,Scala的參數都做為了對象的成員!所以後續可以繼續訪問

5、Currying,復雜的函數式編程中經常使用,可以維護變量在內存中的狀態,且實現返回函數的鏈式功能,可以實現非常復雜的算法和邏輯;

1)以前java的防暑是new出一個接口實例,並且在接口實例的同調方法callback中來實現業務邏輯,現在是直接把同調方法callback傳遞給我的函數,且在函數體中直接使用,這毫無疑問的簡化代碼的編寫,提升了開發的效率;

2)這種方式非常方便編寫負責的業務邏輯和控制邏輯,對於圖計算,計算機學習,深度學習等至關重要;

函數作為函數的參數傳遞的編程方式是稱之為高階函數的編程方式,Spark源碼和應用程序開發至少60%都是這種代碼!

object functionalProgramming{

//1、函數和變量一樣作為Scala語言的一等公民,函數可以直接復制給變量

def mian(args:Array【String】);Unit={

val hiData = hiBigData -

hiDAta("Spark")

val f = (name:String)=>println("Hi,"+name)

f("Kafka")

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)}

def funResult(message:String) = (name:String)=>println(message +":"+name)

funcResult("Hello")("Java")

val result=funcResult("Hello")

result("Java")

}

def hiBIgData(name:String){

println("Hi,"+name)

}

.

Spark函數式編程進階