Kotlin學(xué)習(xí)手冊(cè)(八)內(nèi)聯(lián)函數(shù)let熬词、with、run吸重、apply互拾、also

如需轉(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者合陵。
  • 序言:七十年代末枢赔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拥知,更是在濱河造成了極大的恐慌踏拜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件低剔,死亡現(xiàn)場(chǎng)離奇詭異速梗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)襟齿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門姻锁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人猜欺,你說(shuō)我怎么就攤上這事位隶。” “怎么了开皿?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵钓试,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我副瀑,道長(zhǎng),這世上最難降的妖魔是什么恋谭? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任糠睡,我火速辦了婚禮,結(jié)果婚禮上疚颊,老公的妹妹穿的比我還像新娘狈孔。我一直安慰自己信认,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布均抽。 她就那樣靜靜地躺著嫁赏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪油挥。 梳的紋絲不亂的頭發(fā)上潦蝇,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音深寥,去河邊找鬼攘乒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惋鹅,可吹牛的內(nèi)容都是我干的则酝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼闰集,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沽讹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起武鲁,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤爽雄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后洞坑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盲链,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年迟杂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刽沾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡排拷,死狀恐怖侧漓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情监氢,我是刑警寧澤布蔗,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站浪腐,受9級(jí)特大地震影響纵揍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜议街,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一泽谨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦吧雹、人聲如沸骨杂。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)搓蚪。三九已至,卻和暖如春丁鹉,著一層夾襖步出監(jiān)牢的瞬間妒潭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鳄炉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杜耙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓拂盯,卻偏偏與公主長(zhǎng)得像佑女,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谈竿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353