Kotlin边用边学:4句顺口溜驯服apply / with / run / also / let

Key Takeaways(划重点)

  • let it run with dream
  • it also applies to self
  • 有显式使用 this 时,请换成 it 调用
  • 可为null时别和with搭档

背景

Kotlin是一门简洁、高效的语言,为此,它的ifwhenthrow都支持expression而非Java的纯Statement,其官方的Coding Conventions也有如下建议:

Prefer using an expression body for functions with the body consisting of a single expression.

与此同时,Kotlin更是提供了5个类似的、便于在对给定对象的上下文下执行区块代码的函数(to execute a block of code in the context of a given object):T.apply, with, run/T.run, T.also, T.let。官方也提供了这5个函数的使用建议:Using scope functions apply/with/run/also/let。这个官方建议相对而言比较高屋建瓴或者说比较抽象,具体使用的时候还是得猜/试/蒙,这和我们严谨的程序员作风严重不符。

纯接口分析

先撇开run的其中一个光杆变体(其实也没分析它的必要),直接对5个函数定义进行分析:

T.also((T) -> Unit): T
T.apply(T.() -> Unit): T

T.let((T) -> R): R
T.run(T.() -> R): R
with(T, T.() -> R): R

直观的结论就是:

  • also, apply的返回值是自身,差异是
    • also是参数(it)
    • apply是扩展函数(this)
  • let, run, with的返回值是被执行函数体的返回值,差异是
    • let是参数(it)
    • run和with是扩展函数(this)

上述的差异可以通过简单的两句顺口溜陈述:

  • let it run with dream
  • it also applies to self

简单的分词来帮助记忆(参考下表):

  • letit(参数)runwiththis(扩展函数),返回值是dream(被执行函数体的返回值)
  • alsoit(参数)applythis(扩展函数),返回值是self(自身)
it分区 this分区 返回值
let it run with dream
it also applies (apply) to self

所以技术层面得到的这两句顺口溜应该能清晰的让我们知道这5个函数的差异了,剩下的就是如何把这些函数用在适合的场景了。

适用场景差异分析

首先清晰的返回值差异已经可以决定是走第一句还是第二句顺口溜,剩下的就是确定是走参数 it 还是 扩展函数 this

这个其实通过代码就能很清晰的看出结论来:(取自Kotlin官方样例

    // Nice.
    val foo = createBar().also {
        currentBar = it                    // Accessing property of Baz
        observable.registerCallback(it)    // Passing context object as argument
    }
    
    // Yack!
    val foo2 = createBar().apply {
        currentBar = this                    // Accessing property of Baz
        observable.registerCallback(this)    // Passing context object as argument
    }
    // Nice.
    val foo: Bar = createBar().apply {
        color = RED    // Accessing only properties of Bar
        text = "Foo"
    }
    
    // Yack!
    val foo2: Bar = createBar().also {
        it.color = RED    // Accessing only properties of Bar
        it.text = "Foo"
    }

很明显,参数形式的it.color = RED肯定不如扩展函数的color = RED简洁。

this的话,由于Kotlin支持多种scope,因此this的出现会让人比较难以理解到底指向的是哪个。一般而言,扩展函数中如果出现了显式的this调用,那就不如改成参数(it)的方式更容易理解的。

通过代码的分析,我们可以得出:有显式使用this时,请换成it调用

nullable的分析

直接看代码吧:

    // Nice.
    person?.run {
        awarded = true
        award = "Big Stuff"
    }

    // Yack!
    with(person) {
        this?.awarded = true
        this?.award = "Big Stuff"
    }

对于withnullable的处理就远不如其他几个来的方便了。

所以:可为null时别和with搭档

汇总下来就是:

  • let it run with dream
  • it also applies to self
  • 有显式使用this时,请换成it调用
  • 可为null时别和with搭档

希望这四条顺口溜能对你有所帮助,喜欢的话点个赞吧!

更多Kotlin的实用技巧,请参考《Kotlin边用边学系列

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容