本人也是在初學Kotlin,如有錯誤,請幫忙指出,持續更新
Android:Kotlin詳細入門學習指南-函數-基礎語法(六)
建議先看看前面的文章
Android:Kotlin詳細入門學習指南-基礎語法(一)
Android:Kotlin詳細入門學習指南-基本類型-基礎語法(二)
Android:Kotlin詳細入門學習指南-包-控制流-返回與跳轉-基礎語法(三)
Android:Kotlin詳細入門學習指南-類和對象-基礎語法(四)
Android:Kotlin詳細入門學習指南-類和對象(下)-基礎語法(五)
這篇文章分享的內容比較多,建議先關注收藏,再查看,以免迷路
函數
函數聲明
在 kotlin 中用關鍵字 fun 聲明函數:
fun double(x: Int): Int { }
函數用法
通過傳統的方法調用函數
val result = double(2)
通過 . 調用成員函數
Sample().foo() // 創建Sample類的實例,調用foo方法
參數
函數參數是用 Pascal 符號定義的 name:type。參數之間用逗號隔開,每個參數必 須指明類型。
fun powerOf(number: Int, exponent: Int) { ... }
默認參數
函數參數可以設置默認值,當參數被忽略時會使用默認值。這樣相比其他語言可以減 少重載。
fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size() ) { ... }
默認值可以通過在type類型後使用 = 號進行賦值
命名參數
fun reformat(str: String, normalizeCase: Boolean = true,
upperCas eFirstLetter: Boolean = true, divideByCamelHumps: Boolean = false,
wordSeparator: Char = ' ') { ... }
以使用默認參數
reformat(str)
然而當調用非默認參數是就需要像下面這樣:
reformat(str, true, true, false, '_')
使用命名參數我們可以讓代碼可讀性更強:
reformat(str,
normalizeCase = true,
uppercaseFirstLetter = true,
divideByCamelHumps = false,
wordSeparator = '_'
)
如果不需要全部參數的話可以這樣:
reformat(str, wordSeparator = '_')
不帶返回值的參數
如果函數不會返回任何有用值,那麼他的返回類型就是 Unit . Unit 是一個只 有唯一值 Unit 的類型.這個值並不需要被直接返回,可以省略不寫,和java的void一樣
fun printHello(name: String?): Unit {}
fun printHello(name: String?) {} //省略
單表達式函數
當函數只返回單個表達式時,大括號可以省略並在 = 後面定義函數體
fun double(x: Int): Int = x*2
fun double(x: Int) = x * 2
變長參數
函數的參數(通常是最後一個參數)可以用 vararg 修飾符進行標記:
fun asList<T>(vararg ts: T): List<T> {
val result = ArrayList<T>()
for (t in ts)
result.add(t)
return result
}
val list = asList(1, 2, 3)
當調用變長參數的函數時,我們可以一個一個的傳遞參數,比如 asList(1, 2, 3) ,或者我們要傳遞一個 array 的內容給函數,我們就可以使用 * 前綴操作符:
val a = array(1, 2, 3)
val list = asList(-1, 0, *a, 4)
函數範圍
Kotlin 中可以在文件頂級聲明函數,這就意味者你不用像在Java,C#或是Scala一樣 創建一個類來持有函數。除了頂級函數,Kotlin 函數可以聲明爲局部的,作爲成員 函數或擴展函數。
局部函數
Kotlin 支持局部函數,比如在一個函數包含另一函數。
局部函數可以訪問外部函數的局部變量(比如閉包)
局部函數甚至可以返回到外部函數
成員函數
成員函數是定義在一個類或對象裏邊的
class Sample() {
fun foo() {
print("Foo")
}
}
成員函數可以用 . 的方式調用 Sample.foo()
泛型函數
函數可以有泛型參數,樣式是在函數後跟上尖括號。
fun sigletonArray<T>(item: T): Array<T> {
return Array<T>(1, {item})
}
尾遞歸函數
Kotlin 支持函數式編程的尾遞歸。這個允許一些算法可以通過循環而不是遞歸解決 問題,從而避免了棧溢出。當函數被標記爲 tailrec 時,編譯器會優化遞歸,並 用高效迅速的循環代替它。
tailrec fun findFixPoint(x: Double = 1.0): Double
= if (x == Math.cos(x)) x
else findFixPoint(Math.cos(x))
這段代碼計算的是數學上的餘弦不動點。Math.cos 從 1.0 開始不斷重複,直到值不 變爲止,結果是 0.7390851332151607 這段代碼和下面的是等效的:
private fun findFixPoint(): Double {
var x = 1.0
while (true) {
val y = Math.cos(x)
if ( x == y )
return y
x = y
}
}
使用 tailrec 修飾符必須在最後一個操作中調用自己。在遞歸調用代碼後面是不 允許有其它代碼的,並且也不可以在 try/catch/finall 塊中進行使用。當前的尾遞歸 只在 JVM 的後端中可以用.