轻松理解kotlin中标准函数let、run、with、apply、also的区别

    技术2022-07-11  111

    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来指代对象awith(a){} 等价于 a.run{} public inline fun <R> run(block: () -> R): R = block() public inline fun <T, R> T.run(block: T.() -> R): R = block() public inline fun <T, R> T.let(block: (T) -> R): R = block(this) public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

    以下两个标准函数,都是返回调用对象本身

    a.apply{}与a.also{}是等效的,它们的区别类似run函数和let函数的区别 public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this } public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }

    或者可以这样更直观的来理解

    a.run{ 通过this关键字(大部分情况下可省略)来使用对象a }    返回值为{}中的返回值run{} 等价于 this.run{}    返回值为{}中的返回值a.let{ 通过it来使用对象a }    返回值为{}中的返回值with(a){ 通过this关键字(大部分情况下可省略)来使用对象a }    返回值为{}中的返回值a.apply{ 通过this关键字(大部分情况下可省略)来使用对象a }    返回值是对象aa.also{ 通过it来使用对象a }    返回值是对象a

     

    本人也是初学kotlin,水平有限,如有错误,欢迎指正。

     

    Processed: 0.012, SQL: 9