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{}
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 }    返回值是对象a
  • a.also{ 通过it来使用对象a }    返回值是对象a

 

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

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐