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


转载自:https://blog.csdn.net/feiying066/article/details/107065676/

你可能感兴趣的:(kotlin中标准函数let、run、with、apply、also的区别【转载】)