scala定義函數的標準格式為:
def 函數名(參數名1: 參數類型1, 參數名2: 參數類型2) : 返回類型 = {函數體}
函數示例1:返回Unit類型的函數
def shout1(content: String) : Unit = {println(content)
}
函數示例2:返回Unit類型的函數,但是沒有顯式指定返回類型。(當然也可以返回非Unit類型的值)
def shout2(content: String) = {println(content)
}
函數示例3:返回值類型有多種可能,此時也可以省略Unit
def shout3(content: String) = {if(content.length >= 3)content + "喵喵喵~"else3
}
函數示例4:帶有默認值參數的函數,調用該函數時,可以只給無默認值的參數傳遞值,也可以都傳遞,新值會覆蓋默認值;傳遞參數時如果不按照定義順序,則可以通過參數名來指定。
def shout4(content: String, leg: Int = 4) = {println(content + "," + leg)
}
函數示例5:變長參數(不確定個數參數,類似Java的…)
def sum(args: Int*) = {var result = 0for(arg <- args)result += argresult
}
遞歸函數:遞歸函數在使用時必須有明確的返回值類型
def factorial(n: Int): Int = {if(n <= 0)1elsen * factorial(n - 1)
}
注意
1、Scala可以通過=右邊的表達式 推斷出函數的返回類型。如果函數體需要多個表達式,可以用代碼塊{}。
2、可以把return 當做 函數版本的break語句。
3、遞歸函數一定要指定返回類型。
4、變長參數通過*來指定,所有參數會轉化為一個seq序列。
過程
我們將函數的返回類型為Unit的函數稱之為過程。
定義過程示例1:
def shout1(content: String) : Unit = {println(content)
}
定義過程示例2:
def shout1(content: String) = {println(content)
}
注意:這只是一個邏輯上的細分,如果因為該概念導致了理解上的混淆,可以暫時直接跳過過程這樣的描述。畢竟過程,在某種意義上也是函數。
懶值
當val被聲明為lazy時,他的初始化將被推遲,直到我們首次對此取值,適用于初始化開銷較大的場景。
lazy示例:通過lazy關鍵字的使用與否,來觀察執行過程
object Lazy {def init(): String = {println("init方法執行")"嘿嘿嘿,我來了~"}def main(args: Array[String]): Unit = {lazy val msg = init()println("lazy方法沒有執行")println(msg)}
}