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 的对象本身。

相关推荐
We་ct1 小时前
LeetCode 77. 组合:DFS回溯+剪枝,高效求解组合问题
开发语言·前端·算法·leetcode·typescript·深度优先·剪枝
KerwinChou_CN1 小时前
什么是流式输出,后端怎么生成,前端怎么渲染
前端
爱上妖精的尾巴1 小时前
8-18 WPS JS宏 正则表达式-边界匹配
开发语言·javascript·正则表达式·wps·jsa
爱上妖精的尾巴1 小时前
8-20 WPS JS宏 正则表达式-懒惰匹配
服务器·前端·javascript
网络点点滴1 小时前
组件通信props方式
前端·javascript·vue.js
二十雨辰1 小时前
[小结]-线上Bug监控
前端·bug
前端技术1 小时前
【鸿蒙实战】从零打造智能物联网家居控制系统:HarmonyOS Next分布式能力的完美诠释
java·前端·人工智能·分布式·物联网·前端框架·harmonyos
CHU7290351 小时前
指尖践行环保——旧衣服回收小程序前端功能玩法详解
前端·小程序
weixin_443478511 小时前
flutter组件学习之Flex / Expanded弹性布局组件
javascript·学习·flutter
LawrenceLan1 小时前
38.Flutter 零基础入门(三十八):网络请求实战 http、dio —— 获取列表与刷新 UI
开发语言·前端·flutter·dart