函數式編程進階
一、函數和變量同樣做爲Scala語言的一等公民,函數能夠直接複製給變量;
二、函數更長用的方式是匿名函數,定義的時候只須要說明輸入參數的類型和函數體便可,不須要名稱,可是匿名函數賦值給一個變量(實際上是val常量),Spark源碼中大量存在這種語法;
三、函數能夠做爲參數直接傳遞給函數,這極大地簡化的編程語法;
四、函數式編程一個很是強大的地方之一在於函數的返回值能夠是函數,當函數的返回類型是函數的時候,這個時候就是代表Scala的函數是實現了閉包!
Scala壁報的內幕是:Scala的函數背後是類和對象,因此,Scala的參數都作爲了對象的成員!因此後續能夠繼續訪問
五、Currying,複雜的函數式編程中常常使用,能夠維護變量在內存中的狀態,且實現返回函數的鏈式功能,能夠實現很是複雜的算法和邏輯;
1)之前java的防暑是new出一個接口實例,而且在接口實例的同調方法callback中來實現業務邏輯,如今是直接把同調方法callback傳遞給個人函數,且在函數體中直接使用,這毫無疑問的簡化代碼的編寫,提高了開發的效率;
2)這種方式很是方便編寫負責的業務邏輯和控制邏輯,對於圖計算,計算機學習,深度學習等相當重要;
函數做爲函數的參數傳遞的編程方式是稱之爲高階函數的編程方式,Spark源碼和應用程序開發至少60%都是這種代碼!
object functionalProgramming{
//一、函數和變量同樣做爲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)
}
.