Kotlin 基礎(chǔ)精華篇
Kotlin 內(nèi)聯(lián)函數(shù)let、with矾兜、run损趋、apply、also
Kotlin 協(xié)程學(xué)習(xí)總結(jié)
本文將用到的對(duì)象UserInfo
class UserInfo {
var id = 0L
var name = ""
var phone = ""
var email = ""
var type = 0
fun getString() = "$name, $phone, $email"
fun setName(familyName: String, givenName: String) {
this.name = "$givenName, $familyName"
}
fun setEmail(vararg emails: String) {
this.email = emails.toString()
}
}
一焕刮、let
let擴(kuò)展函數(shù)的實(shí)際上是一個(gè)作用域函數(shù)舶沿,最后一行可作為返回值return
使用場(chǎng)景:
1.使用let函數(shù)處理需要針對(duì)一個(gè)可null的對(duì)象統(tǒng)一做判空處理
2.明確一個(gè)變量所處特定的作用域范圍內(nèi),在作用域范圍內(nèi)用it來(lái)代替變量
val result = userInfo?.let {
it.id = 12L
it.phone = "13266668888"
it.email = getEmail()
//最后一行為返回值, 若無(wú)需要也可無(wú)返回值
it.getString()
}
//若userInfo是null,則result是null;
//若userInfo不為null配并,則result為13266668888
println(result)
二括荡、with
將某對(duì)象作為函數(shù)的參數(shù),在函數(shù)塊內(nèi)可以通過(guò) this 指代該對(duì)象溉旋。返回值為函數(shù)塊的最后一行或指定return表達(dá)式畸冲。
使用場(chǎng)景:
需要多次調(diào)用同一個(gè)類(lèi)的多個(gè)方法或?qū)傩詴r(shí),可以省去類(lèi)名重復(fù)观腊,直接調(diào)用類(lèi)的方法或?qū)傩砸叵校?jīng)常用于Android中RecyclerView中onBinderViewHolder
if (userInfo != null) {
val result = with(userInfo!!) {
id = 12L
phone = "123567890"
email = getEmail()
//最后一行為返回值, 若無(wú)需要也可無(wú)返回值
getString()
}
println(result) //輸出 13266668888
}
三、run
run函數(shù)實(shí)際上相當(dāng)于let和with兩個(gè)函數(shù)的結(jié)合體梧油,run函數(shù)只接收一個(gè)lambda函數(shù)為參數(shù)苫耸,以閉包形式返回,返回值為最后一行儡陨。
使用場(chǎng)景:
適用于let,with函數(shù)任何場(chǎng)景褪子,并且彌補(bǔ)了let、with的缺點(diǎn)骗村。
let 在函數(shù)體內(nèi)必須使用it參數(shù)替代對(duì)象
with 要求傳入對(duì)象非空(否則就得多次判空嫌褪,體現(xiàn)不出with的優(yōu)勢(shì))
val result = userInfo?.run {
id = 12L
phone = "123567890"
email = getEmail()
//最后一行為返回值, 若無(wú)需要也可無(wú)返回值
getString()
}
println(result) //輸出 13266668888
四、apply
與run功能類(lèi)似胚股,只是返回值的不同笼痛。
run 是返回最后一行代碼的值
apply 是返回傳入對(duì)象本身
使用場(chǎng)景:
一般用于一個(gè)對(duì)象實(shí)例初始化的時(shí)候,需要對(duì)對(duì)象中的屬性進(jìn)行賦值
val result = userInfo?.apply {
id = 12L
phone = "123567890"
email = getEmail()
getString()
}
println(result) //輸出 com.example.xxx.UserInfo@6b884d57
五、also
與let功能類(lèi)似缨伊,只是返回值的不同摘刑。
let 是返回最后一行代碼的值
also 是返回傳入對(duì)象本身
使用場(chǎng)景:
let適用的場(chǎng)景,或多個(gè)擴(kuò)展函數(shù)鏈?zhǔn)秸{(diào)用
var result = userInfo?.also {
it.id = 12L
it.phone = "13266668888"
it.email = getEmail()
it.getString()
}
println(result) //輸出 com.example.xxx.UserInfo@6b884d57
//將原本不支持鏈?zhǔn)秸{(diào)用的UserInfo使用also鏈起來(lái)
result = userInfo?.also {
it.id = 12L
}?.also {
it.setEmail("123@qq.com", "456@qq.com")
}?.also {
it.setName("li", "xiaoming")
}