Scala基礎
學習twitter的scala教程的筆記
函數
-
函數定義娇钱,scala語法中可以使用多種方式定義函數伤柄,比如:
- 直接用等號定義涡尘,
def func(x:Int):Int = x+1
- 用大括號定義
- 直接用等號定義涡尘,
def func2(x:Int):Int = {
return x+1
}
* 用匿名函數定義,`val func3=(x:Int)=> x+1`响迂,可以使用大括號{}考抄,`val func3=()=>{x+1}`,在此例中func3為方法名蔗彤,等號為賦值川梅,可以理解為將等號后面的內容賦值給func3。
-
匿名函數是指用戶可以定義一個函數然遏,而不用指定這個函數的名稱贫途。可以對比思考Java語言中的匿名類待侵,語法為
(x:Int)=>x+1
或者使用括號{}丢早,(x:Int)=>{x+1}
,返回值類型為=>后的最后一個表達式 - 有類型的函數秧倾,scala函數的函數其實都是對象怨酝,所以可以通過賦值的方式定義,那么既然是對象那先,就有類型农猬。scala函數的類型都是這個樣子的:
scala.Function1[Int,Int]
。Function1指的是一個入參的函數售淡,顧名思義Function2是兩個入參的函數斤葱。最多可以有22個入參。既然是對象揖闸,就有方法揍堕,函數的執(zhí)行,使用過基類的apply方法調用的汤纸。所以如果我明定義func3為一個函數類型的對象衩茸,那么可以通過func3.apply()的方式執(zhí)行func3函數。 - 函數作為參數使用蹲嚣,因為函數使用類型的递瑰,那么就可以作為參數傳遞。比如:
object Main extends App {
println(timesTwo(2))
println(best(2,(x:Int)=>x+1))
println(best(2,timesTwo))
def timesTwo(i:Int):Int={
i*2
}
def best(i:Int,f:scala.Function1[Int,Int]): Int ={
return f.apply(i)
}
}
- 偏函數與柯理化函數隙畜,這是函數部分最復雜的內容了抖部。先說偏函數化(partial application),在scala中有種東西叫”“议惰。如果下劃線出現(xiàn)在函數的參數中慎颗,那么就意味著這個參數的值還不確定,有點類似于占位符或者通配符的概念,如果調用一個函數的時候俯萎,向一個參數中傳遞了”“傲宜,那么這次調用不會返回值,而是返回另一個函數夫啊,函數的入參就是剛才被"_"占位的參數列表函卒。而柯里化函數是更加明確的使用偏函數∑裁校可以通過函數上的curried方法講一個普通函數轉為柯里化函數报嵌。例子:
def multiply(m:Int)(n:Int):Int=n*m
val multiply2=(m:Int,n:Int)=> n*m
val multiply3=multiply2.curried