1.普通函數(有參函數、無參函數)
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))
2.遞歸函數:在函數體內調用自己本身
// 計算num的階乘
def fun1(num:Int):Int = {
if(num == 1||num == 0) 1
else num * fun1(num - 1)
}
3.默認值的函數
def fun2(num1:Int = 10,num2:Int = 20) = {
num1 + num2
}
def fun3(num1:Int,num2:Int = 20) = {
num1 + num2
}
def fun4(num1:Int=10,num2:Int) = {
num1 + num2
}
4.可變參數個數的函數
def fun4(elements :Int*)={
var sum = 0;
for(elem <- elements){
sum += elem
}
sum
}
println(fun4(1,2,3,4))
5.匿名函數
var fun6 = (num1:Int,num2:Int) => num1+ num2
6.嵌套函數
def fun7(num:Int)={
def fun8(a:Int,b:Int):Int={
if(a == 1){
b
}else{
fun8(a-1,a*b)
}
}
fun8(num,1)
}
7.偏應用函數
偏應用函數是一種表達式,不需要提供函數需要的所有參數,只需要提供部分,或不提供所需參數。
def log(date:Date,content:String) = {
println("date:" + date + "\tcontent:" + content)
}
val date = new Date()
log(date,"log1")
log(date,"log2")
log(date,"log3")
println("==============================")
val logBoundDate = log(date,_:String)
logBoundDate("log11")
logBoundDate("log12")
logBoundDate("log13")
8.高階函數
函數的參數是函數,或者函數的返回類型是函數,或者函數的參數和函數的返回類型都是函數的函數。
/**
* 函數的參數是函數:
* f1:(Int)=>Int 告訴要傳入的函數的格式
* 把函數當成了對象穿來穿去、scala支持面向函數編程
*/
def highFun1(f1:(Int)=>Int,num:Int) = {
f1(num)
}
def tmpFun(num1:Int) = {
num1+1000
}
/**
* 函數的返回是函數
* 函數無參數
* 函數的返回個(Int,Int)=>Double格式的函數
*/
def highFun2():(Int,Int)=>Double = {
def tmpFun2(num1:Int,num2:Int):Double = {
num1 + num2
}
tmpFun2
}
def highFun3():(Int,Int)=>Double = {
(num1:Int,num2:Int)=>num1+num2
}
/**
* 函數是參數是函數,返回也是函數
* 這個函數也是高階函數
*/
def highFun4(f1:(Int,Int) => Int,num1:Int):(Int)=>Double = {
val rest = f1(num1,1000)
(num:Int) => num + 1
}
def highFun5(num:Int):(Int)=>Int = {
def fun(a:Int)={
num + a
}
fun
}
9. 柯里化函數
可理解爲對高階函數的簡化
def klhFun(a:Int)(b:Int) = a*b
Scala語言的簡寫規則:
函數的返回值類型可以省略,因爲scala具備自動推測的功能,他會根據返回值的自動來決定這個函數的返回值類型
將你要返回的值放在函數的最後一行,那麼這個值就會被自動返回
如果你的函數體內只有一個語句,可以將這行語句與函數名在一行。
總結:
對於遞歸函數 必須明確返回值類型,不然不知所措;
默認值的函數中,如果傳入的參數個數與函數定義相同,則傳入的數值會覆蓋默認值;如果不想覆蓋默認值,傳入的參數個數小於定義的函數的參數,則需要指定參數名稱;
在scala中+=前後的數值類型必須一致,+前後的數值類型可以不一致;
注意點:
1)匿名函數不能顯示的聲明返回值類型
2)匿名函數必須賦給一個變量、變量,通過變量來調用這個匿名函數
3)匿名函數的參數與函數體必須要用=>來關聯