使用过Kotlin的人一定会对其丰富的内置函数有深刻印象。今天要谈的是这么几个:
let
,run
,with
,apply
,also
可以说灵活掌握这几个函数,对写出更好的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里面,this
和it
的含义,以及返回的结果。
对于let而言,this
还是当前类,比如安卓的Activity
里面在这时候就可以直接指它自己。
知道this
和it
的信息,就知道要调用谁了。而知道返回结果,就知道是否可以链式调用了。
比如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很像。