kotlin中标准函数let、run、with、apply、also的区别【转载】

kotlin中,let、run、with、apply、also这几个标准函数使用起来非常方便,合理使用可以很大程度上的简化代码,但是这几个标准函数用法和功能相似,初学kotlin时,很容易会不知道该选哪一个,其实看下源码并熟悉kotlin的高阶函数就很容易理解了。这几个标准函数的源码如下,新版本里面加入了一些别的代码,不过不影响这里的说明。
注:为了方便描述,以下的a.*的a代表一个对象a;下文中提到的等价只是功能上相同,用法上几乎相同,但在特殊情况下使用起来是会有细微的区别的,比如说a可能为空的时候。
以下四个标准函数,都是返回高阶函数的返回值
run{}与a.run{}的区别:run{}里面的高阶函数是运行在当前作用域内,a.run{}里面的高阶函数是运行在对象a的作用域内
a.run{}与a.let{}的区别:a.run{}里面的高阶函数是运行在对象a的作用域内,可以用this关键字(大部分情况下可省略)指代对象a,a.let{}是把对象a作为参数传到高阶函数里面,需要用it来指代对象a
with(a){} 等价于 a.run{}
publicinlinefunrun(block: () ->R): R = block()
publicinlinefunT.run(block:T.() ->R): R = block()
publicinlinefunT.let(block: (T) ->R): R = block(this)
publicinlinefunwith(receiver:T, block:T.() ->R): R = receiver.block()
以下两个标准函数,都是返回调用对象本身
a.apply{}与a.also{}是等效的,它们的区别类似run函数和let函数的区别
publicinlinefunT.apply(block:T.() ->Unit): T { block(); returnthis}
publicinlinefunT.also(block: (T) ->Unit): T { block(this); returnthis}
或者可以这样更直观的来理解
a.run{ 通过this关键字(大部分情况下可省略)来使用对象a }返回值为{}中的返回值
run{} 等价于 this.run{}返回值为{}中的返回值
a.let{ 通过it来使用对象a }返回值为{}中的返回值
with(a){ 通过this关键字(大部分情况下可省略)来使用对象a }返回值为{}中的返回值
a.apply{ 通过this关键字(大部分情况下可省略)来使用对象a }返回值是对象a
a.also{ 通过it来使用对象a }返回值是对象a


【kotlin中标准函数let、run、with、apply、also的区别【转载】】转载自:https://blog.csdn.net/feiying066/article/details/107065676/

    推荐阅读