Kotlin标准库的几个函数

使用过Kotlin的人一定会对其丰富的内置函数有深刻印象。今天要谈的是这么几个:
letrunwithapplyalso
可以说灵活掌握这几个函数,对写出更好的Kotlin代码很有好处。
注:文章写于Kotlin版本1.2.30,例子来自这里

预览

之后会解释这是什么意思

╔══════════╦═════════════════╦═══════════════╦═══════════════╗
║ Function ║ Receiver (this) ║ Argument (it) ║    Result     ║
╠══════════╬═════════════════╬═══════════════╬═══════════════╣
║ let      ║ this@MyClass    ║ String("...") ║ Int(42)       ║
║ run      ║ String("...")   ║ N\A           ║ Int(42)       ║
║ run*     ║ this@MyClass    ║ N\A           ║ Int(42)       ║
║ with*    ║ String("...")   ║ N\A           ║ Int(42)       ║
║ apply    ║ String("...")   ║ N\A           ║ String("...") ║
║ also     ║ this@MyClass    ║ String("...") ║ String("...") ║
╚══════════╩═════════════════╩═══════════════╩═══════════════╝

例子

以let为例:

class MyClass {
    fun test() {
        val str: String = "..."
        val result = str.xxx {
            print(this) // Receiver
            print(it) // Argument
            42 // Block return value
        }
    }
}

现在再来说那个表格。意思就是,对每个函数使用类似的例子,在每个函数的block里面,thisit的含义,以及返回的结果。
对于let而言,this还是当前类,比如安卓的Activity里面在这时候就可以直接指它自己。
知道thisit的信息,就知道要调用谁了。而知道返回结果,就知道是否可以链式调用了。
比如let就可以链式调用,尤其和?.结合的时候更是应付null的利器。
而返回自身的也不是一无是处,那些函数可以在返回参数前进行临时处理,或者还有很多用法。

值得一提的是表格的*号,意思就是这时候函数是以常规函数调用的,比如run {}以及with(args) {},而不是跟在变量后面。

下面谈谈自己对这几个函数的使用心得:

let

一般就是arg?.let{}用来代替if (arg != null) {},但let更优越的一点是有返回值,可以链式调用:arg?.let{// do sth}?.let{// do other stuff}

run

说实话这可能是我用的最少的了,我的印象里面可以用来当做返回点?因为Kotlin没有break或者continue。
另外感觉像是一个简便函数。

with

在安卓里面如果一个对象要做很多事的话,我就会用with把它提出来,因为这样this就直接指代该对象,可以直接调用其函数或者数据。
例如:

with (intent) {
    val userId = getStringExtra("key")
}

当然看表格的话,run和apply都有这个本事,不过语境上感觉还是with更合适这么做。

apply

用处也很大,各种临时加工。比如一个Activity的intent总是包含某一些值,但是其他部分不能确定,这时候就可以写一个函数,返回共同的intent,然后具体使用的时候再用:

intent.apply{
  putExtra("key", "value")
}

这样就避免代码重复。

also

几乎没怎么用过,感觉和apply很像。

推荐阅读更多精彩内容