在Kotlin中的實用語法

Kotlin的標準程式庫裡面有一些實用的標準函數,可以讓我們在寫程式的時候能寫出更簡潔、易讀的程式碼,接下來我們就來認識他們吧!

apply

通常在沒有apply的世界,我們要創建一個檔案並且給他一些基本設定的時候我們會這樣寫:

val kuroFile = File("kuro.txt")
kuroFile.setReadable(true)
kuroFile.setWritable(true)
kuroFile.setExecutable(false)

使用apply的時候,程式碼會變成這樣:

val kuroFile = File("kuro.txt").apply {
    setReadable(true)
    setWritable(true)
    setExecutable(false)
}

我們可以看到,在apply的lambda函數後面有一個 this: File 的提示,代表在這個lambda函數裡面我們可以使用“this”這個關鍵字來代替“kuroFile這個變數”,而在語法上大部分的時候“this”這個關鍵字是可以省略的,所以使用apply的時候我們就可以不需要再寫一堆同樣的變數名稱。而且apply會回傳呼叫的物件本身。

also

跟apply很像的是also,至於為什麼很像,我們來看看範例:

val kuroFile = File("kuro.txt").also {
    it.setReadable(true)
    it.setWritable(true)
    it.setExecutable(false)
}

also跟apply一樣的是會回傳呼叫函數的物件本身,但是他的提示不是“this”而是“it”,因為it沒辦法省略,所以我們通常不會使用also來做像apply這樣一長串的物件設定,而是會拿來做不會影響到物件本身的函數呼叫或是輸出運算結果:

val kuroFile = File("kuro.txt").also {
    println(it.name)
    for (line in it.readLines()) {
        println(line)
    }
}

run

run在lambda函數裡面的特性跟apply是一樣的,只不過run會回傳“最後一行的結果”:

Calendar.getInstance().run {
    add(Calendar.HOUR, 1)
    get(Calendar.HOUR)
}.run(::println)

run適合用來對物件做完設定之後取值,或是用來拆開巢狀函數呼叫,讓我們的程式碼不會那麼“巢”。另外run也可以不需要透過物件獨立呼叫,不過比較少這樣使用。

let

我們在前面講到nullable型態的時候有看到let函數,這邊我們正式介紹他。let是run跟also的結合,他在lambda函數裡面使用“it”並且回傳lambda函數的最後一行。當然let也有不少合適的使用情境,不過我們最常拿他來幫nullable物件做而外的運算處理。

with

with跟run是幾乎一樣的東西,他需要傳入一個引數,後面的lambda函數會使用這個傳入的引數,並且返回lambda函數的最後一行。跟run不同的是,因為run可以對nullable型態選用安全呼叫,但是with無法。

takeIf/takeUnless

takeIf跟takeUnless兩個是很相似的東西,依照字面上的意思,我們可以理解成“如果......就拿走”/“如果不......就拿走”。他們的lambda函數最後都要回傳布林值,如果為true/false,就會回傳原本的物件。如果為false/true就會回傳null

val phoneOrNull = "09123456789".takeIf { it.matches(Regex("^09\\d{8}$")) }

Last updated