kotlin 中with let run apply 调用与区别

在kotlin中可以直接调用的函数,叫做标准函数. with run apply 是比较常见,但它们三者之间也是有区别的.

with

with 直接调用,有两个参数. 第一个是数据对象,第二个是lambda表达式.其中lambda表达式中持有参数一数据对象的上下文,没有返回值.

  with("hello world"){
       val msg =  replace("hello","hi")
       println(msg)
   }

// 控制台打印  hi world

let

对象直接调用,有一个lambda参数.允许对一个对象执行特定的操作,并在操作完成之后返回结果,通常用于处理可空对象或对一个对象链式调用.

val name: String? = "John"

val result = name?.let { it ->
    val upperCaseName = it.toUpperCase()
    "Hello, $upperCaseName!"
} ?: "Name is null"

println(result) // 输出:"Hello, JOHN!"

run

需要数据对象调用,有一个lambda参数.同样lambda表达式中也持有数据对象的上下文. 有返回值.

 val sbRun =  StringBuffer().run {
        append(1)
        append(2)
        append(3)
        append(4)
        append(5)
  }
  println(sbRun.toString())

// 控制台打印  12345

apply

需要数据对象调用,和run类似有一个lambda参数,同样lambda表达式中也持有数据对象的上下文. 有返回值.

val sbApply =  StringBuffer().apply {
        append(9)
        append(8)
        append(7)
  }
 println(sbApply.append(65).toString())

// 控制台打印  98765

run 与 apply 区别

如果仅仅上看上面的代码,两个函数直接是没有区别的, 如果把run 示例代码修改成如下,控制台输出是什么结果呢?

 val sbRun =  StringBuffer().run {
        append("a")
        append("b")
        append("c")
        888888
  }
 println(sbRun.toString())


// 控制台打印 888888
run.png

打印结果是 lambda表达式最后一行代码.并且类型是Int. 而不是StringBuffer. 那么在来看看apply函数.

apply.png

上面控制台打印结果: 你好呀. 丝毫不受lambda表达式最后一行的影响.

总结

with 直接调用不需要数据对象. 有两个参数.没有返回值.
let 在对象上执行操作,并返回操作结果.用于处理可空对象或进行链式调用.
run 需要数据对象调用,只有一个参数,有返回值. 将lambda表达式中最后一行代码作为返回值返回.
apply 需要数据对象调用,只有一个参数,有返回值. 将调用者数据对象作为返回值返回.
run 和 apply 函数很像,但是返回值不一样.

你可能感兴趣的:(kotlin 中with let run apply 调用与区别)