本人也是在初學(xué)Kotlin,如有錯(cuò)誤,請(qǐng)幫忙指出,持續(xù)更新
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-函數(shù)-基礎(chǔ)語法(六)
建議先看看前面的文章
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基礎(chǔ)語法(一)
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基本類型-基礎(chǔ)語法(二)
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-包-控制流-返回與跳轉(zhuǎn)-基礎(chǔ)語法(三)
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-類和對(duì)象-基礎(chǔ)語法(四)
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-類和對(duì)象(下)-基礎(chǔ)語法(五)
這篇文章分享的內(nèi)容比較多,建議先關(guān)注收藏,再查看矗积,以免迷路
函數(shù)
函數(shù)聲明
在 kotlin 中用關(guān)鍵字 fun 聲明函數(shù):
fun double(x: Int): Int { }
函數(shù)用法
通過傳統(tǒng)的方法調(diào)用函數(shù)
val result = double(2)
通過 . 調(diào)用成員函數(shù)
Sample().foo() // 創(chuàng)建Sample類的實(shí)例,調(diào)用foo方法
參數(shù)
函數(shù)參數(shù)是用 Pascal 符號(hào)定義的 name:type。參數(shù)之間用逗號(hào)隔開盅抚,每個(gè)參數(shù)必 須指明類型漠魏。
fun powerOf(number: Int, exponent: Int) { ... }
默認(rèn)參數(shù)
函數(shù)參數(shù)可以設(shè)置默認(rèn)值,當(dāng)參數(shù)被忽略時(shí)會(huì)使用默認(rèn)值。這樣相比其他語言可以減 少重載妄均。
fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size() ) { ... }
默認(rèn)值可以通過在type類型后使用 = 號(hào)進(jìn)行賦值
命名參數(shù)
fun reformat(str: String, normalizeCase: Boolean = true,
upperCas eFirstLetter: Boolean = true, divideByCamelHumps: Boolean = false,
wordSeparator: Char = ' ') { ... }
以使用默認(rèn)參數(shù)
reformat(str)
然而當(dāng)調(diào)用非默認(rèn)參數(shù)是就需要像下面這樣:
reformat(str, true, true, false, '_')
使用命名參數(shù)我們可以讓代碼可讀性更強(qiáng):
reformat(str,
normalizeCase = true,
uppercaseFirstLetter = true,
divideByCamelHumps = false,
wordSeparator = '_'
)
如果不需要全部參數(shù)的話可以這樣:
reformat(str, wordSeparator = '_')
不帶返回值的參數(shù)
如果函數(shù)不會(huì)返回任何有用值柱锹,那么他的返回類型就是 Unit . Unit 是一個(gè)只 有唯一值 Unit 的類型.這個(gè)值并不需要被直接返回,可以省略不寫丰包,和java的void一樣
fun printHello(name: String?): Unit {}
fun printHello(name: String?) {} //省略
單表達(dá)式函數(shù)
當(dāng)函數(shù)只返回單個(gè)表達(dá)式時(shí)禁熏,大括號(hào)可以省略并在 = 后面定義函數(shù)體
fun double(x: Int): Int = x*2
fun double(x: Int) = x * 2
變長參數(shù)
函數(shù)的參數(shù)(通常是最后一個(gè)參數(shù))可以用 vararg 修飾符進(jìn)行標(biāo)記:
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)
當(dāng)調(diào)用變長參數(shù)的函數(shù)時(shí),我們可以一個(gè)一個(gè)的傳遞參數(shù)邑彪,比如 asList(1, 2, 3) 瞧毙,或者我們要傳遞一個(gè) array 的內(nèi)容給函數(shù),我們就可以使用 * 前綴操作符:
val a = array(1, 2, 3)
val list = asList(-1, 0, *a, 4)
函數(shù)范圍
Kotlin 中可以在文件頂級(jí)聲明函數(shù)寄症,這就意味者你不用像在Java,C#或是Scala一樣 創(chuàng)建一個(gè)類來持有函數(shù)宙彪。除了頂級(jí)函數(shù),Kotlin 函數(shù)可以聲明為局部的有巧,作為成員 函數(shù)或擴(kuò)展函數(shù)释漆。
局部函數(shù)
Kotlin 支持局部函數(shù),比如在一個(gè)函數(shù)包含另一函數(shù)篮迎。
局部函數(shù)可以訪問外部函數(shù)的局部變量(比如閉包)
局部函數(shù)甚至可以返回到外部函數(shù)
成員函數(shù)
成員函數(shù)是定義在一個(gè)類或?qū)ο罄镞叺?/p>
class Sample() {
fun foo() {
print("Foo")
}
}
成員函數(shù)可以用 . 的方式調(diào)用 Sample.foo()
泛型函數(shù)
函數(shù)可以有泛型參數(shù)男图,樣式是在函數(shù)后跟上尖括號(hào)示姿。
fun sigletonArray<T>(item: T): Array<T> {
return Array<T>(1, {item})
}
尾遞歸函數(shù)
Kotlin 支持函數(shù)式編程的尾遞歸。這個(gè)允許一些算法可以通過循環(huán)而不是遞歸解決 問題逊笆,從而避免了棧溢出栈戳。當(dāng)函數(shù)被標(biāo)記為 tailrec 時(shí),編譯器會(huì)優(yōu)化遞歸难裆,并 用高效迅速的循環(huán)代替它子檀。
tailrec fun findFixPoint(x: Double = 1.0): Double
= if (x == Math.cos(x)) x
else findFixPoint(Math.cos(x))
這段代碼計(jì)算的是數(shù)學(xué)上的余弦不動(dòng)點(diǎn)。Math.cos 從 1.0 開始不斷重復(fù)差牛,直到值不 變?yōu)橹姑Y(jié)果是 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 修飾符必須在最后一個(gè)操作中調(diào)用自己堰乔。在遞歸調(diào)用代碼后面是不 允許有其它代碼的偏化,并且也不可以在 try/catch/finall 塊中進(jìn)行使用。當(dāng)前的尾遞歸 只在 JVM 的后端中可以用.