作者簡介:CSDN博客專家、華為云享專家認證
系列專欄:Kotlin 初學者
學習交流:三人行必有我師焉;擇其善者而從之,其不善者而改之,
目錄
標準函式
1.1 apply
1.2 let
1.3 also
1.4 run
1.5 with
1.6 takelf
1.7 takeUnless
標準函式
標準函式是指Standard.kt檔案中定義的函式,任何Kotlin代碼都可以自由的呼叫所有標準函式,標準函式有很多我們這里主要學習下幾個常用的標準函式,
1.1 apply
apply函式可看作一個配置函式,你可以傳入一個接收者,然后呼叫一系列函式來配置它以便使用,如果提供lambda給apply函式執行,它會回傳配置好的接收者,
fun main() {
var map = mutableMapOf("帥次" to 18).apply {
put("apply-北京",188)
put("apply-上海",288)
}
println(map)//{帥次=18, apply-北京=188, apply-上海=288}
}
-
1、創建可變Map
-
2、通過apply()函式添加資料
如下,咱們啟動一個界面并傳參
val intent = Intent(this,NextActivity::class.java).apply {
putExtra("name","sc")
putExtra("age",19)
}
startActivity(intent)
可以看到,呼叫一個個函式類配置接收者時,變數名(map、intent)就省掉了,這是因為,在lambda運算式里,apply能讓每個配置函式都作用于接收者,這種行為有時又叫做相關作用域,因為lambda運算式里的所有函式呼叫都是針對接收者的,或者說,它們是針對接收者的隱式呼叫,
1.2 let
let函式能使某個變數作用于其lambda運算式里,讓it關鍵字能參考它,let與apply比較,let會把接收者傳給lambda,而apply什么都不傳,匿名函式執行完,apply會回傳當前接收者,而let會回傳lambda的最后一行,
var letData = 20.let {
"不知不覺過去 $it 年了"
}
println(letData)

1.3 also
also函式和let函式功能相似,和let一樣,also也是把接收者作為值參傳給lambda,但有一點不同:also回傳接收者物件,而let回傳lambda結果,因為這個差異,also尤其適合針對同一原始物件,利用副作用做事,既然also回傳的是接收者物件,你就可以基于原始接收者物件執行額外的鏈式呼叫,
//also
var alsoData = "AndroidSHUAICI"
var strAlso = alsoData.also {
println(it.length)//14
}.also {
println(it.startsWith("Android"))//true
}
println(strAlso)//AndroidSHUAICI
1.4 run
具備接收者的隱式呼叫(apply),回傳的是lambda的最后一行(let),
//run
var str = "Android帥次"
var s = str.run {
startsWith("Android")
}
println(s)//true
加強版
fun main() {
var runS = str.run {
startsWith("Android")
println(this)//Android帥次
"吼吼哈嘿"//這里決定下一個run的this型別
}.run {
println(this)//吼吼哈嘿
18//這里的18傳入到isAge函式
}.run(::isAge)
println(runS)//false
}
fun isAge(age: Int) = age > 15
從上面看出,run支持鏈式呼叫,run也支持函式參考,
1.5 with
with函式是run的變體,功能一樣,但是呼叫with時需要值參作為其第一個引數傳入,
var strWith = "Android帥次"
var sWith = strWith.run {
startsWith("Android")
"run-$this"
}
println(sWith)//run-Android帥次
sWith = with(strWith) {
startsWith("Android")
"with-$this"
}
println(sWith)//with-Android帥次
1.6 takelf
如果需要判斷某個條件是否滿足,再決定是否可以賦值變數或執行某項任務,takelf就非常有用,概念上講,takelf函式類似于if陳述句,但它的優勢是可以直接在物件實體上呼叫,避免了臨時變數賦值的麻煩,
takelf函式需要判斷lambda中提供的條件運算式,給出true或false結果:
-
如果判斷結果是true,從takelf函式回傳接收者物件,
-
如果是false,則回傳null,
val strTakeIf = "Android帥次"
val tkif = strTakeIf.takeIf {
it.startsWith("Android")//回傳true
}
println(tkif)//Android帥次
var tkifS= strTakeIf.takeIf {
it.startsWith("Android")
}.takeIf {
println("Length:${it?.length}")//Length:9
it?.length!! > 20//回傳false
}
println(tkifS)//null
1.7 takeUnless
takelf輔助函式takeUnless,只有判斷你給定的條件結果是false時,takeUnless才會回傳原始接收者物件,跟takelf剛好相反
val strTakeIfUn = "Android帥次"
val un = strTakeIf.takeUnless {
it.startsWith("Android")//回傳true
}
println(un)//null
var un2 = strTakeIfUn.takeUnless {
it.startsWith("帥次")//回傳false
}
println(un2)//Android帥次
takeUnless函式有點調皮,了解一下就行,還是感覺takelf比較好理解和使用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/395167.html
標籤:其他
