scala定義函式的幾種方式
scala是面向物件的語言,同時也是函數語言程式設計語言。函式在scala中是一等公民,它和變數一樣,既可以作為其他函式的引數,也可以將函式賦值給一個變數。
在scala中定義函式有很多方式,不熟悉scala的同學初看之時難免被搞得暈頭轉向。這裡,我試圖按照函式是否有返回值來總結一下函式定義的規律,僅供參考。
一、有返回值的函式定義:
1、標準形式(就是函式形參,返回型別,return語句全有)
def addInt(a:Int, b:Int):Int = {
var total:Int = a + b
return total
}
括號裡是形參,冒號後面是返回型別,大括號裡是函式體。
注意,有返回值的函式定義在大括號前必須有等號,不能省略。
2、省略返回型別和return
當有返回值的時候,可以不顯式寫出返回型別,scala會自動判斷。同時return也可以省略。上面的函式可以簡寫成:
def addInt(a:Int, b:Int) = {
a + b
}
scala自動返回函式體中最後一個表示式的值並判斷型別。這裡再多說一句,在java中例如x=1這樣的表示式返回的是1,而在scala中賦值語句返回的是空值。所以,如果你想返回值,不要以賦值語句作為最後一條語句。
3、省略大括號
當函式體只有一行語句的時候,可以省略大括號。上面的函式可以再簡寫成:
def addInt(x:Int, y:Int) = a + b
怎麼樣,是不是比java簡潔很多。
上面3種情況是有返回值的,下面說說無返回值的,更簡單。
二、無返回值的函式定義
1、顯式標識無返回值
def retrunNone(a:Int,b:Int):Unit = {
print(a + b)
}
Unit關鍵字表示函式無返回值。
2、省略Unit
和有返回值類似,這裡也可以省略Unit,讓scala自己去知道這個函式無返回值。那麼它是怎麼知道的呢?就是省略等號。當函式定義沒有等號的時候,scala認為這個函式無返回值。
def retrunNone(a:Int,b:Int){
print(a + b)
}
最後,我們說說也是經常會看到的一種函式定義——匿名函式。
匿名函式顧名思義,就是沒有名字的函式。它可以作為函式的引數,也可以直接賦值給變數。
val addInt = (x:Int,y:Int)=> x + y //將一個函式賦值給變數,呼叫的時候addInt(1,2)
def myFun(f : (Int,Int) => Int, x:Int, y:Int) = f(x,y)
上面這個函式定義了一個匿名函式作為函式的引數,這個匿名函式有兩個Int的引數,返回型別是Int。
呼叫的時候我們可以將任何滿足匿名函式條件的函式傳入,比如addInt。
那麼就是myFun(addInt, 1, 2),返回的是3。
好了,函式定義就先說這麼多,歡迎關注後續文章。