1.普通函數(shù),scala函數(shù)不明顯使用return返回值,如果有返回值,最后一行就是返回值
1.1定義返回值為Int的函數(shù)
def fun(x:Int,y:Int) : Int = {
? ? x+y//返回x+y的結(jié)果
}
等價函數(shù):
def fun(x:Int,y:Int) = {//不寫返回值類型scala會自動匹配最后一行的輸出結(jié)果類型作為返回值類型
? ? x+y//返回x+y的結(jié)果
}
1.2無返回值函數(shù)
//如果沒有返回值可以省略冒號、返回值類型、等號;定義沒有返回值的函數(shù)(返回值為Unit)
def fun(x:String,y:String){
? ? println(x + "-" + y)
}
相當于?
def fun(x:Int,y:Int) : Unit={
? ? println(x + "-" + y)
}
1.3定義帶有初始值參數(shù)的函數(shù)
def fun(x:Int=10) = {
? ? x + 5
}

注意:調(diào)用有參數(shù)的函數(shù)必須在函數(shù)名后加()

調(diào)用帶有初始值參數(shù)的函數(shù),傳入的參數(shù)會覆蓋參數(shù)初始值
2.值函數(shù)
說明:函數(shù)體賦給一個變量,調(diào)用的時候直接使用變量的名稱
val valueFunction = (x:Int)=>x+1
調(diào)用:valueFunction(20)
相當于如下函數(shù)的定義:
def valueFunction(x:Int) : Int = x+1
多個語句的值函數(shù)
dec valueMultiFunction(x:Int) {
? ? var b = x+2
? ? println("b" + b)
}
3.匿名函數(shù)
val str1 = Array(1,2,3,4).map((x:Int)=>x+1).mkString(",")
//參數(shù)類型推倒
val str2 = Array(1,2,3,4).map((x)=>x+1).mkString(",")
//函數(shù)只有一個參數(shù)的話,可以省略()
val str3 = Array(1,2,3,4).map(x=>x+1).mkString(",")
////如果參數(shù)右邊只出現(xiàn)一次,則可以進一步簡化
val str4 = Array(1,2,3,4).map(_+1).mkString(",")
4.高階函數(shù)
4.1函數(shù)參數(shù)
= 左邊定義函數(shù)的參數(shù) ,規(guī)定傳入的“函數(shù)”參數(shù)類型,= 右邊調(diào)用傳入的“函數(shù)”并給一個參數(shù)值,這個參數(shù)值的類型就是定義的傳入“函數(shù)”參數(shù)的“參數(shù)”類型如f:(Int)為Int型(太繞嘴了)
定義:def paramFunction(f:(Int)=>String)=f(10)
說明:f:(Int)=>String定義傳入的“函數(shù)”參數(shù),這個函數(shù)的輸入?yún)?shù)為Int型,返回值為String類型

調(diào)用:paramFunction((x:Int)=>"Hello " + x)
4.2調(diào)用函數(shù)產(chǎn)生一個新的函數(shù)(函數(shù)返回值為函數(shù))
定義:def productNewFunction(y:Int)=(x:Int)=>x * y
說明:(大白話表達)相當于一個函數(shù)里定義了一個匿名函數(shù),把最外層函數(shù)的參數(shù)賦給函數(shù)體內(nèi)的匿名函數(shù),匿名函數(shù)有自己的參數(shù),當調(diào)用外層函數(shù)的時候返回一個中間函數(shù),當再次調(diào)用中間函數(shù)的時候才會返回數(shù)據(jù)結(jié)果。

演示:
5.函數(shù)閉包
定義:
var freeParam=10
def closeFun(x:Int)=x + freeParam
說明:
x:綁定變量,x的類型在定義函數(shù)的時候就已經(jīng)定義好了,x的值在函數(shù)調(diào)用的時候確定

freeParam:自由變量,在定義函數(shù)之前類型不固定,freeParam值可以不斷的變化,freeParam值影響到整個函數(shù)的結(jié)果。注意:freeParam變量必須在閉包函數(shù)定義之前定義,否則報錯
調(diào)用:

關(guān)于閉包(大白話):freeParam變量的類型和值在運行的時候確定,而且freeParam的值可以不斷的變化并且影響整個函數(shù)的結(jié)果,這種由自由式變?yōu)榉忾]式的過程就是閉包