1、Scala函數(shù)的定義
def fun (a: Int , b: Int ) : Unit ={
println(a+b)
}
fun(1,1)
def fun1 (a : Int , b : Int)= a+b
println(fun1(1,2))
def max(a:Int, b:Int) ={
if (a > b) {
a
} else {
b
}
}
- 方法可以寫(xiě)返回值的類(lèi)型也可以不寫(xiě),會(huì)自動(dòng)推斷,有時(shí)候不能省略,必須寫(xiě),比如
在遞歸函數(shù)中,或者函數(shù)的返回值是函數(shù)類(lèi)型的時(shí)候 - Scala中函數(shù)有返回值時(shí),可以寫(xiě)
return,也可以不寫(xiě)return,會(huì)把函數(shù)中最后一行當(dāng)做結(jié)果返回。當(dāng)寫(xiě)return時(shí),必須指定函數(shù)的返回值 - 如果返回值可以一行搞定,可以將
{ }省略不寫(xiě) - Scala規(guī)定傳遞給方法的參數(shù)都是
常量val的,不是var的 - 如果去掉方法體前面的
等號(hào) ={ },那么這個(gè)方法返回類(lèi)型必定是Unit的。無(wú)論方法體里面是什么邏輯都成立;Scala可以把任意類(lèi)型轉(zhuǎn)換為Unit。假設(shè),里面的邏輯最后返回了一個(gè)String,那么這個(gè)返回值會(huì)被轉(zhuǎn)換成Unit,并且值會(huì)被丟棄。
2、遞歸函數(shù)
自己調(diào)自己,必須指定函數(shù)的返回值類(lèi)型
// 5的階乘
def fun2(num :Int) :Int= {
if(num ==1)
num
else
num * fun2(num-1)
}
print(fun2(5))
3、包含參數(shù)默認(rèn)值的函數(shù)
類(lèi)型后面直接指定默認(rèn)值
def fun3(a :Int = 10,b:Int) = {
println(a+b)
}
fun3(b=2)
- 如果傳入的參數(shù)個(gè)數(shù)與函數(shù)定義相同,則傳入的數(shù)值會(huì)覆蓋默認(rèn)值。
- 如果不想覆蓋默認(rèn)值,傳入的參數(shù)個(gè)數(shù)小于定義的參數(shù),則需要
指定參數(shù)名稱(chēng)。
4、可變參數(shù)個(gè)數(shù)的函數(shù)
多個(gè)參數(shù)用逗號(hào)分開(kāi)
def fun4(elements :Int*)={
var sum = 0;
for(elem <- elements){
sum += elem
}
sum
}
println(fun4(1,2,3,4))
5、匿名函數(shù):()=>{}
可以將匿名函數(shù),返回給val定義的值
匿名函數(shù)不能顯式聲明函數(shù)的返回類(lèi)型,它會(huì)自己類(lèi)型推導(dǎo)
匿名函數(shù)中參數(shù)只用了1次,用_代替
// 有參數(shù)匿名函數(shù)
val value1 = (a : Int) => {
println(a)
}
value1(1)
// 無(wú)參數(shù)匿名函數(shù)
val value2 = ()=>{
println("我愛(ài)Scala")
}
value2()
// 有返回值的匿名函數(shù)
val value3 = (a:Int, b:Int) =>{
a+b
}
println(value3(4,4))
6、嵌套函數(shù)
方法里面套方法,從上到下執(zhí)行,main()函數(shù)里面定義函數(shù)
// 嵌套函數(shù)求5的階乘
def fun5(num :Int)={
def fun6(a:Int, b:Int) :Int={
if(a == 1){
b
} else {
fun6(a-1,a*b)
}
}
fun6(num,1)
}
println(fun5(5))
7、偏應(yīng)用函數(shù)
是一個(gè)表達(dá)式,指定不變的,變化的用_表示
不需要提供函數(shù)需要的所有參數(shù),只需要提供部分,或不提供所需參數(shù)
def log(date :Date, s :String) ={
println("date is "+ date +",log is "+ s)
}
val date = new Date()
log(date ,"log1")
log(date ,"log2")
log(date ,"log3")
// 想要調(diào)用log,以上變化的是第二個(gè)參數(shù),可以用偏應(yīng)用函數(shù)處理
val logWithDate = log(date,_:String)
logWithDate("aaa")
logWithDate("bbb")
logWithDate("ccc")
8、高階函數(shù)
參數(shù)是函數(shù),直接傳函數(shù)名,不要調(diào)用
返回是函數(shù),必須顯示聲明返回值類(lèi)型
// 函數(shù)的參數(shù)是函數(shù)
def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = {
f(a,100)
}
def f(v1 :Int,v2: Int):Int = {
v1+v2
}
println(hightFun(f, 1))
// 函數(shù)的返回是函數(shù)
// 1,2,3,4相加
// 給1個(gè)Int,給1個(gè)Int,出1個(gè)Int
def hightFun2(a:Int, b:Int) : (Int, Int)=>Int = {
def f2 (v1:Int, v2:Int) :Int = {
v1+v2+a+b
}
f2
}
println(hightFun2(1, 2)(3, 4))
// 函數(shù)的參數(shù)是函數(shù),函數(shù)的返回是函數(shù)
def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = {
f
}
println(hightFun3(f)(100,200))
println(hightFun3((a,b) =>{a+b})(200,200))
// 以上這句話(huà)還可以寫(xiě)成這樣
// 如果函數(shù)的參數(shù)在方法體中只使用了一次 那么可以寫(xiě)成_表示
println(hightFun3(_+_)(200,200))

高階函數(shù)
9、柯里化函數(shù)
理解為高階函數(shù)的簡(jiǎn)化
def fun7(a:Int, b:Int)(c:Int, d:Int) = {
a+b+c+d
}
println(fun7(1,2)(3,4))

Scala函數(shù)