Kotlin apply和with用法和区别

apply

apply 是 Kotlin 标准库中的一个函数,它允许你在对象上执行一系列操作,然后返回该对象自身。它的语法结构如下:

复制代码
fun <T> T.apply(block: T.() -> Unit): T

这个函数接受一个 lambda 表达式作为参数,该 lambda 表达式被应用于调用 apply 的对象,并可以在 lambda 中对对象进行任何操作。

  • 对象初始化和配置:apply 通常用于初始化一个对象并对其进行属性设置。例如:

    复制代码
     val person = Person().apply {
         name = "Alice"
         age = 25
         // 其他属性设置
     }
  • 对象转换和修改:apply 还可以用于对现有对象进行修改或转换

    复制代码
      val modifiedPerson = person.apply {
         age += 5
         // 其他属性修改
     }

上面的示例中,我们使用 apply 函数修改了现有的 person 对象的属性。这在需要对对象进行一系列修改时非常有用。总的来说,apply 函数提供了一个简洁而强大的方式来初始化和配置对象,使代码更易读、更具可维护性。

with

它的语法结构如下:

复制代码
fun <T, R> with(receiver: T, block: T.() -> R): R

这个函数接受两个参数:第一个是对象 receiver,第二个是 lambda 表达式 block。在 with 函数的作用域内,我们可以直接访问 receiver 对象中的属性和方法。

复制代码
data class Person(var name: String, var age: Int)

val person = Person("Alice", 25)
val result = with(person) {
    name = "Bob"
    age = 30
    "$name is $age years old."
}
println(person) // 输出:Person(name=Bob, age=30)
println(result) // 输出:Bob is 30 years old.

在上面的示例中,我们创建了一个 Person 对象,并使用 with 函数来对其进行属性设置和操作。在 with 的 lambda 表达式中,我们修改了对象的 name 和 age 属性。最后,将返回一个字符串,其中包含修改后的 name 和 age 属性值。

区别

with 函数和 apply 函数在 Kotlin 中都用于在特定上下文中执行代码块,但它们有一些区别。

  • 作用对象:

    with 函数的第一个参数是一个对象,并且该对象将成为 lambda 表达式内部的上下文对象。在 lambda 内部,可以直接访问该对象的属性和方法。

    apply 函数的作用对象是调用 apply 函数的对象本身。在 lambda 内部,可以直接访问调用 apply 的对象的属性和方法。

  • 返回值:

    with 函数的返回值是 lambda 表达式的结果。

    apply 函数的返回值是调用 apply 的对象本身。

相关推荐
玫城9 小时前
[ VUE ] 封装通用数组校验组件,el-input内使用
前端·javascript·vue.js
低调小一11 小时前
深度复盘:KMP 在字节跳动的工程化落地实践
android·kotlin
弓.长.13 小时前
React Native 鸿蒙跨平台开发:实现一个多功能单位转换器
javascript·react native·react.js
zh_xuan13 小时前
kotlin 密封类
开发语言·kotlin
南半球与北海道#13 小时前
前端打印(三联纸票据打印)
前端·vue.js·打印
摘星编程14 小时前
React Native for OpenHarmony 实战:ToggleSwitch 切换开关详解
javascript·react native·react.js
董世昌4114 小时前
深入浅出 JavaScript 常用事件:从原理到实战的全维度解析
前端
满栀58514 小时前
分页插件制作
开发语言·前端·javascript·jquery
qq_4061761414 小时前
深入剖析JavaScript原型与原型链:从底层机制到实战应用
开发语言·前端·javascript·原型模式
弓.长.15 小时前
React Native 鸿蒙跨平台开发:BottomSheet 底部面板详解
javascript·react native·react.js