kotlin作用域函数run、let、apply、with、also的区别和使用

在 Kotlin 中,runletapplywith、also这几个方法有一些区别,主要体现在用途和使用方式上。

一、run 方法

  1. 函数签名T.run(block: T.() -> R),这里的 T 是接收者类型,R 是返回值类型。它接收一个 lambda 表达式作为参数,在 lambda 表达式中可以访问接收者对象,并返回一个结果。
  2. 用途
    • 可以在需要对一个对象进行一系列操作并返回一个结果时使用。
    • 常用于减少临时变量的使用,使代码更加简洁。
  3. 示例
   val str = "Hello"
   val length = str.run {
       println("Inside run: $this")
       this.length
   }
   println("Length: $length")

二、let 方法

  1. 函数签名T.let(block: (T) -> R),它接收一个接收者对象作为参数,并在 lambda 表达式中对这个对象进行操作,返回一个结果。
  2. 用途
    • 当你想对一个对象进行一些操作并返回一个与该对象不同类型的结果时很有用。
    • 可以在 lambda 表达式中使用安全调用(?.)和非空断言(!!)来处理可能为空的对象。
  3. 示例
   val nullableStr: String? = null
   nullableStr?.let {
       println("Length of non-null string: ${it.length}")
   }

三、apply 方法

  1. 函数签名T.apply(block: T.() -> Unit),它接收一个 lambda 表达式作为参数,在 lambda 表达式中可以访问接收者对象,但不返回任何结果。
  2. 用途
    • 通常用于配置或初始化一个对象。在 lambda 表达式中,可以对接收者对象进行一系列的属性设置和方法调用,最后返回配置好的对象本身。
  3. 示例
   val person = Person().apply {
       name = "Alice"
       age = 30
   }
   println(person)

四、with 方法

  1. 函数签名with(receiver: T, block: T.() -> R),它接收一个接收者对象和一个 lambda 表达式作为参数,在 lambda 表达式中可以访问接收者对象,并返回一个结果。
  2. 用途
    • 与 run 方法类似,但它将接收者对象作为参数传递给方法,而不是作为扩展函数调用。
    • 可以在需要对一个对象进行一系列操作并返回一个结果时使用。
  3. 示例
   val str = "Hello"
   val length = with(str) {
       println("Inside with: $this")
       this.length
   }
   println("Length: $length")

五、also 方法

  1. 函数签名T.also(block: (T) -> Unit),它接收一个 lambda 表达式作为参数,在 lambda 表达式中可以访问接收者对象,并执行一些额外的操作,但最终返回接收者对象本身。
  2. 用途
    • 通常用于在对一个对象进行操作的同时,还需要执行一些额外的副作用操作,比如打印日志、记录状态等,并且不改变对象的类型和值。
    • 可以在链式调用中方便地插入一些中间操作,而不影响整个操作链的结果。
  3. 示例
   val number = 10
   val result = number.also { println("Processing $it") }
   println(result) // 输出 10

区别总结

  • runletwith都可以对一个对象进行操作并返回一个结果,但调用方式和参数传递略有不同。runwith都是以扩展函数的方式调用,而with需要将接收者对象作为参数传递。let则是将接收者对象作为参数传递给 lambda 表达式。
  • apply主要用于配置或初始化对象,不返回结果,而是返回配置好的对象本身。
  • also 主要用于在不改变对象的情况下执行一些额外的副作用操作,并返回对象本身,常用于链式调用中插入中间操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值