如需轉(zhuǎn)載請(qǐng)?jiān)u論或簡(jiǎn)信,并注明出處嚎幸,未經(jīng)允許不得轉(zhuǎn)載
Kotlin系列導(dǎo)讀
Kotlin學(xué)習(xí)手冊(cè)(一)類與繼承
Kotlin學(xué)習(xí)手冊(cè)(二)屬性與字段
Kotlin學(xué)習(xí)手冊(cè)(三)接口
Kotlin學(xué)習(xí)手冊(cè)(四)內(nèi)部類
Kotlin學(xué)習(xí)手冊(cè)(五)函數(shù)
Kotlin學(xué)習(xí)手冊(cè)(六)數(shù)組與集合
Kotlin學(xué)習(xí)手冊(cè)(七)for循環(huán)
Kotlin學(xué)習(xí)手冊(cè)(八)內(nèi)聯(lián)函數(shù)let颜矿、with、run嫉晶、apply骑疆、also
Kotlin學(xué)習(xí)手冊(cè)(九)空類型安全
Kotlin學(xué)習(xí)手冊(cè)(十)帶你真正理解什么是Kotlin協(xié)程
目錄
let
函數(shù)結(jié)構(gòu)
object.let{
//在函數(shù)體內(nèi)使用it替代object對(duì)象去訪問(wèn)其公有的屬性和方法
it.todo()
...
}
//另一種用途 判斷object為null的操作
//表示object不為null的條件下,才會(huì)去執(zhí)行l(wèi)et函數(shù)體
object?.let{
it.todo()
}
適用的場(chǎng)景
使用let函數(shù)處理需要針對(duì)一個(gè)可null的對(duì)象統(tǒng)一做判空處理(常用)
需要去明確一個(gè)變量所處特定的作用域范圍內(nèi)可以使用
例子
- 不使用
let
mTextView?.textSize(...)
mTextView?.setTextColor(...)
mTextView?.background(..)
- 使用
let
mTextView?.let{
it..textSize(...)
it.setTextColor(...)
it.background(..)
}
特點(diǎn)
- 函數(shù)體內(nèi)使用
it
指代當(dāng)前對(duì)象 - 返回值為函數(shù)塊的最后一行或指定
return
表達(dá)式 - 可以在調(diào)用
let
之前判空處理
with
函數(shù)結(jié)構(gòu)
with(object){
//todo
}
適用的場(chǎng)景
- 適用于調(diào)用同一個(gè)類的多個(gè)方法時(shí)替废,可以省去類名重復(fù)箍铭,直接調(diào)用類的方法即可(經(jīng)常用于Android中RecyclerView中onBinderViewHolder中,數(shù)據(jù)model的屬性映射到UI上)
例子
- 不使用
with
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
itemView.shop_tv_edit.setOnClickListener(listener)
itemView.shop_tv_insert.setOnClickListener(listener)
itemView.shop_tv_show.setOnClickListener(listener)
itemView.shop_tv_hide.setOnClickListener(listener)
}
- 使用
with
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
with(itemView) {
shop_tv_edit.setOnClickListener(listener)
shop_tv_insert.setOnClickListener(listener)
shop_tv_show.setOnClickListener(listener)
shop_tv_hide.setOnClickListener(listener)
}
}
特點(diǎn)
- 在函數(shù)塊內(nèi)可以通過(guò)
this
指代當(dāng)前對(duì)象 - 返回值為函數(shù)塊的最后一行或指定
return
表達(dá)式
run
函數(shù)結(jié)構(gòu)
object.run{
//todo
}
適用的場(chǎng)景
- 適用于
let
椎镣,with
函數(shù)任何場(chǎng)景
例子
- 不使用
run
override fun onBindViewHolder(holder: ViewHolder, position: Int){
val item = getItem(position)?: return
with(item){
holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
holder.tvExtraInf = "難度:$gradeInfo | 單詞數(shù):$length | 讀后感: $numReviews"
}
}
- 使用
run
override fun onBindViewHolder(holder: ViewHolder, position: Int){
getItem(position)?.run{
holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
holder.tvExtraInf = "難度:$gradeInfo | 單詞數(shù):$length | 讀后感: $numReviews"
}
}
特點(diǎn)
- 函數(shù)體內(nèi)使用
this
指代當(dāng)前對(duì)象或者省略 - 返回值為函數(shù)塊的最后一行或指定
return
表達(dá)式 - 可以在調(diào)用
run
之前判空處理
run
函數(shù)是let
诈火,with
兩個(gè)函數(shù)結(jié)合體,適用于let
状答,with
函數(shù)任何場(chǎng)景冷守。準(zhǔn)確來(lái)說(shuō)它彌補(bǔ)了let
函數(shù)在函數(shù)體內(nèi)必須使用it
參數(shù)替代對(duì)象刀崖,在run
函數(shù)中可以像with
函數(shù)一樣可以省略,直接訪問(wèn)實(shí)例的公有屬性和方法教沾,另一方面它彌補(bǔ)了with
函數(shù)傳入對(duì)象判空問(wèn)題蒲跨,在run
函數(shù)中可以像let
函數(shù)一樣做判空處理
apply
函數(shù)結(jié)構(gòu)
object.apply{
//todo
}
適用的場(chǎng)景
適用于
run
函數(shù)的任何場(chǎng)景,一般用于初始化一個(gè)對(duì)象實(shí)例的時(shí)候授翻,操作對(duì)象屬性或悲,并最終返回這個(gè)對(duì)象動(dòng)態(tài)
inflate
出一個(gè)XML的view
的時(shí)候需要給view
綁定數(shù)據(jù)一般可用于多個(gè)擴(kuò)展函數(shù)鏈?zhǔn)秸{(diào)用
數(shù)據(jù)
model
多層級(jí)包裹判空處理的問(wèn)題
例子
- 不使用
apply
val wgDialog = WGDialog(this@ShopStuffActivity)
wgDialog.message = "該頁(yè)面尚未保存,是否返回堪唐?"
wgDialog.btnLeft = "取消"
wgDialog.btnRight = "確定"
wgDialog.addListener(WGDialog.Item.RIGHT, object: WGDialogInterface.OnClickListener{
override fun onButtonClick(which: Int, isCheck: Boolean) {
finish()
}
})
wgDialog.show()
- 使用
apply
WGDialog(this@ShopStuffActivity).apply {
message = "該頁(yè)面尚未保存巡语,是否返回?"
btnLeft = "取消"
btnRight = "確定"
addListener(WGDialog.Item.RIGHT, object: WGDialogInterface.OnClickListener{
override fun onButtonClick(which: Int, isCheck: Boolean) {
finish()
}
})
}.show()
特點(diǎn)
- 函數(shù)體內(nèi)使用
this
指代當(dāng)前對(duì)象或者省略 - 返回的值是對(duì)象本身(
this
) - 可以在調(diào)用
apply
之前判空處理
also
函數(shù)結(jié)構(gòu)
object.also{
//todo
}
適用的場(chǎng)景
- 適用于
let
函數(shù)的任何場(chǎng)景淮菠,唯一的不同是also
返回的值是對(duì)象本身(this
)男公,一般可用于多個(gè)擴(kuò)展函數(shù)鏈?zhǔn)秸{(diào)用
例子
- 不使用
also
mTextView?.textSize(...)
mTextView?.setTextColor(...)
mTextView?.background(..)
- 使用
also
mTextView?.also{
it..textSize(...)
it.setTextColor(...)
it.background(..)
}
特點(diǎn)
- 函數(shù)體內(nèi)使用
it
指代當(dāng)前對(duì)象 - 返回的值是對(duì)象本身(
this
) - 可以在調(diào)用
also
之前判空處理
比較
函數(shù)名 | 函數(shù)體內(nèi)使用的對(duì)象 | 返回值 |
---|---|---|
let | it | 函數(shù)塊的最后一行或指定return表達(dá)式 |
with | this或省略 | 函數(shù)塊的最后一行或指定return表達(dá)式 |
run | this或省略 | 函數(shù)塊的最后一行或指定return表達(dá)式 |
apply | this或省略 | this |
also | it | this |