簡介
Scala 有方法與函數,二者在語義上的區別很小。Scala 方法是類的一部分,而函數是一個對象可以賦值給一個變量。換句話來說在類中定義的函數即是方法。
我們這裏會統稱爲函數。
Scala 中的函數是一個繼承了 Trait類的對象。函數定義由一個 def 關鍵字開始,緊接着是可選的參數列表,一個冒號 : 和方法的返回類型,一個等號 = ,最後是方法的主體。
def functionName ([參數列表]) : [return type]
如果沒有等號和方法主體,那麼函數會被隱式聲明爲抽象(abstract)。
基本函數
//將兩個傳入的參數相加並求和
object add{
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
//如果沒有返回值,可返回Unit類型
object Hello{
def printMe( ) : Unit = {
println("Hello, Scala!")
}
}
//函數調用
object Test {
def main(args: Array[String]) {
println( "Returned Value : " + addInt(5,7) );
}
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
函數傳名調用
scala解釋器在解析函數參數時有兩種方式
- 傳值調用(call-by-value):先計算參數表達式的值,再應用到函數內部
- 傳名調用(call-by-name):將未計算的參數表達式直接應用到函數內部,每次使用傳名調用時,解釋器都會計算一次表達式的值。
object Test {
def main(args: Array[String]) {
delayed(time());
}
def time() = {
println("獲取時間,單位爲納秒")
System.nanoTime
}
def delayed( t: => Long ) = {
println("在 delayed 方法內")
println("參數: " + t)
t
}
}
函數指定參數名
一般情況下函數調用參數,就按照函數定義時的參數順序一個個傳遞。但也可以通過指定函數參數名,並且不需要按照順序向函數傳遞參數,實例如下:
object Test {
def main(args: Array[String]) {
printInt(b=5, a=7);
}
def printInt( a:Int, b:Int ) = {
println("Value of a : " + a );
println("Value of b : " + b );
}
}
可變參數
Scala 通過在參數的類型之後放一個星號來設置可變參數。
object Test {
def main(args: Array[String]) {
printStrings("Runoob", "Scala", "Python");
}
def printStrings( args:String* ) = {
var i : Int = 0;
for( arg <- args ){
println("Arg value[" + i + "] = " + arg );
i = i + 1;
}
}
}
默認參數值
Scala 可以爲函數參數指定默認參數值,使用了默認參數,在調用函數的過程中可以不需要傳遞參數,這時函數就會調用它的默認參數值,如果傳遞了參數,則傳遞值會取代默認值。實例如下:
object Test {
def main(args: Array[String]) {
println( "返回值 : " + addInt() );
}
def addInt( a:Int=5, b:Int=7 ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
匿名函數
scala 中定義匿名函數的語法很簡單,箭頭左邊是參數列表,右邊是函數體。比如,
var inc = (x:Int) => x+1
閉包
閉包是一個函數,返回值依賴於聲明在函數外部的一個或多個變量。
object Test {
def main(args: Array[String]) {
println( "muliplier(1) value = " + multiplier(1) )
println( "muliplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
忠於技術,熱愛分享。歡迎關注公衆號:java大數據編程,瞭解更多技術內容。