使用Kotlin takeIf(或takeUnless)

原文鏈接

在Kotlin的標(biāo)準(zhǔn)函數(shù)球散,有兩大函數(shù),即takeIftakeUnless,乍一看搓蚪,有什么特別之處呢郭蕉?這幾乎就是if疼邀?

或者極端點(diǎn),把每一個(gè)if語(yǔ)句改成類似下面(推薦)召锈。

//原始代碼
if(status){doThis()}
//修改后的代碼
takeIf {status}旁振?apply {doThis()}

深入探討

像其他任何東西一樣,takeIf(或takeUnless)確實(shí)有它的使用場(chǎng)景烟勋。我通過不同情況分享我對(duì)他們的理解规求。在此之前,讓我們看看它的實(shí)現(xiàn)卵惦。

函數(shù)簽名

public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? 
    = if (predicate(this)) this else null

從函數(shù)簽名,我們注意到

  1. 它是從T對(duì)象本身調(diào)用的瓦戚。即T.takeIf沮尿,
  2. predicate函數(shù)以T對(duì)象為參數(shù)
  3. 等待predicate評(píng)估后它返回thisnull

合理的使用情況

基于以上特點(diǎn)较解,我可以推導(dǎo)出它相對(duì)于if的使用情況畜疾,如下:

1.它是從T對(duì)象本身調(diào)用的。即T.takeIf印衔,

它可以很好處理可空性檢查啡捶。一個(gè)例子如下

//原始代碼
if(someObject!= null && status){ 
   doThis()
}
//改進(jìn)的代碼
someObject奸焙?.takeIf {status}瞎暑?apply {doThis()}

2.predicate函數(shù)以T對(duì)象為參數(shù)

由于將T作為predicate的參數(shù),所以可以進(jìn)一步簡(jiǎn)化takeIf代碼

//原始代碼
if(someObject与帆!= null && someObject.status){ 
   doThis()
} 
//更好的代碼
if(someObject了赌?.status == true){ 
   doThis()
}
//改進(jìn)的代碼
someObject?.takeIf {it.status} ?. apply {doThis()}

更好的代碼的確還可以玄糟,但需要顯式的true關(guān)鍵詞勿她,所以并不理想。

3.等待predicate評(píng)估后它返回thisnull

既然它返回this阵翎,那就可以用來進(jìn)行鏈?zhǔn)秸{(diào)用逢并。因此,下面代碼可以優(yōu)化

//原始代碼
if(someObject郭卫!= null && someObject.status){ 
   someObject.doThis()
}
//改進(jìn)的代碼
someObject砍聊?.takeIf {status}?doThis()

或者實(shí)現(xiàn)獲取數(shù)據(jù)或退出的更好方式(例子從Kotlin Doc中摘认渎佟)

val index 
   = input.indexOf(keyword).takeIf {it> = 0}辩恼?:error(“Error”)
val outFile 
   = File(outputDir.path).takeIf {it.exists()}?:return  false

注意

看看下面的代碼。

//語(yǔ)法上仍然正確灶伊。但邏輯錯(cuò)誤疆前!
someObject?.takeIf {status} .apply {doThis()}

//正確的(注意可空性檢查聘萨?)
someObject竹椒?.takeIf {status} ?.apply {doThis()}

doThis()在第一行中不管statustrue 還是 false 都會(huì)執(zhí)行米辐。因?yàn)?即使takeIf返回null胸完,它仍然會(huì)被調(diào)用。(這里假設(shè)doThis()不是someObject的函數(shù))

所以在這里翘贮,第二行的? 是非常微妙且重要的赊窥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狸页,隨后出現(xiàn)的幾起案子锨能,更是在濱河造成了極大的恐慌,老刑警劉巖芍耘,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件址遇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡斋竞,警方通過查閱死者的電腦和手機(jī)倔约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坝初,“玉大人浸剩,你說我怎么就攤上這事〔甭簦” “怎么了乒省?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畦木。 經(jīng)常有香客問我袖扛,道長(zhǎng),這世上最難降的妖魔是什么十籍? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任蛆封,我火速辦了婚禮,結(jié)果婚禮上勾栗,老公的妹妹穿的比我還像新娘惨篱。我一直安慰自己,他們只是感情好围俘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布砸讳。 她就那樣靜靜地躺著琢融,像睡著了一般。 火紅的嫁衣襯著肌膚如雪簿寂。 梳的紋絲不亂的頭發(fā)上漾抬,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音常遂,去河邊找鬼纳令。 笑死,一個(gè)胖子當(dāng)著我的面吹牛克胳,可吹牛的內(nèi)容都是我干的平绩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼漠另,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捏雌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酗钞,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腹忽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后砚作,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘹锁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年葫录,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片领猾。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡米同,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摔竿,到底是詐尸還是另有隱情面粮,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布继低,位于F島的核電站熬苍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏袁翁。R本人自食惡果不足惜柴底,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粱胜。 院中可真熱鬧柄驻,春花似錦、人聲如沸焙压。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至野哭,卻和暖如春在塔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虐拓。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工心俗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓉驹。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓城榛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親态兴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狠持,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前言 人生苦多,快來 Kotlin 瞻润,快速學(xué)習(xí)Kotlin喘垂! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,217評(píng)論 9 118
  • 《Kotlin 極簡(jiǎn)教程 》第5章 集合類 《Kotlin極簡(jiǎn)教程》正式上架: 點(diǎn)擊這里 > 去京東商城購(gòu)買閱讀 ...
    光劍書架上的書閱讀 2,227評(píng)論 0 11
  • 原文鏈接:https://github.com/EasyKotlin 本章將介紹Kotlin標(biāo)準(zhǔn)庫(kù)中的集合類绍撞,我們...
    JackChen1024閱讀 2,143評(píng)論 1 1
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)正勒,也就是一...
    悟名先生閱讀 4,151評(píng)論 0 13
  • 第一次你的生日,找93人一起發(fā)信息祝你生日快樂傻铣,結(jié)果發(fā)現(xiàn)日子搞錯(cuò)了章贞,后來索性每次的生日我都在那天給你過》侵蓿可是今年鸭限,...
    RedMoon閱讀 585評(píng)論 0 0