当前位置: 首页 > news >正文

Kotlin 作用域函数(let、run、with、apply、also)对比

Kotlin 的 作用域函数(Scope Functions) 是简化代码逻辑的重要工具,它们通过临时作用域为对象提供更简洁的操作方式。以下是 letrunwithapplyalso 的对比分析:


一、核心区别对比表

函数上下文对象引用返回值是否扩展函数典型使用场景
letitLambda 结果非空对象处理、链式操作
runthisLambda 结果对象配置 + 结果计算
withthisLambda 结果对象的多属性操作
applythis对象本身对象初始化配置
alsoit对象本身对象附加操作(如日志、验证)

二、详细对比与使用场景

1. let
val result = obj.let { // 操作 it 对象,返回最后一行结果it.doSomething()"Result" 
}
  • 特点
    • 通过 it 引用上下文对象,避免与外部作用域的 this 冲突。
    • 处理可空对象:配合 ?. 安全调用(obj?.let { ... })。
    • 链式操作:将对象转换为其他结果。
2. run
val result = obj.run { // 直接访问 this(可省略),返回最后一行结果doSomething()"Result"
}
  • 特点
    • 结合了 with 的作用域和 let 的扩展函数特性。
    • 同时操作对象属性并返回结果:适合对象配置后立即计算结果的场景。
3. with
val result = with(obj) {// 直接访问 this(可省略),返回最后一行结果doSomething()"Result"
}
  • 特点
    • 非扩展函数,直接传入对象。
    • 批量操作对象属性:例如初始化对象或对对象进行多次修改。
4. apply
val obj = MyClass().apply { // 直接访问 this(可省略),返回对象本身name = "Kotlin"age = 10
}
  • 特点
    • 返回对象本身,适合对象初始化或链式配置。
    • 类似建造者模式(Builder Pattern)。
5. also
val obj = MyClass().also { // 通过 it 引用对象,返回对象本身println("Created: $it")
}
  • 特点
    • 执行副作用操作:如打印日志、验证数据,但不修改对象。
    • 链式调用中插入额外操作。

三、选择依据

  1. 是否需要返回对象本身?

    • 是 → applyalso
    • 否 → letrunwith
  2. 上下文对象引用方式

    • 需要显式名称(避免 this 冲突) → letalso(使用 it)。
    • 隐式访问属性 → runwithapply(使用 this)。
  3. 处理可空性

    • 使用 ?.let 安全处理可空对象。
  4. 是否需要扩展函数?

    • 是 → 排除 with

四、经典示例

// let:处理可空对象 + 转换结果
val length = nullableString?.let { it.trim().length 
} ?: 0// apply:对象初始化
val person = Person().apply {name = "Alice"age = 30
}// also:链式调用插入日志
val list = mutableListOf(1, 2, 3).also { println("Initial list: $it") }.apply { add(4) }.also { println("Updated list: $it") }

通过理解上下文引用方式、返回值和典型场景,可以更精准地选择合适的作用域函数,提升代码简洁性和可读性。

相关文章:

  • 副业小程序YUERGS,从开发到变现
  • uniapp +vue +springboot多商家订餐系统
  • Harmony开发 List、Grid拖动自定义排序实现
  • Spring之Bean的初始化 Bean的生命周期 全站式解析
  • LeetCode Hot100刷题——轮转数组
  • 【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)
  • docker-compose——安装mongo
  • 搜索引擎工作原理|倒排索引|query改写|CTR点击率预估|爬虫
  • 构建集成差异化灵巧手和先进机器人控制技术的自动化系统
  • Active Directory域环境信息收集实战指南
  • 【网络入侵检测】基于Suricata源码分析运行模式(Runmode)
  • 【诊所电子处方专用软件】佳易王个体诊所门诊电子处方开单管理系统:零售药店电子处方服务系统#操作简单#诊所软件教程#药房划价
  • 【C++ - 仿mudou库one thread one loop式高并发服务器实现】
  • IntraWeb 16.0.2 + Bootstrap 4 居中布局实战(附源码+效果图)
  • 5000 字总结CSS 中的过渡、动画和变换详解
  • 数据库blog1_信息(数据)的处理与效率提升
  • Unity序列化字段、单例模式(Singleton Pattern)
  • Redis 发布订阅模式深度解析:原理、应用与实践
  • 制作大风车动画
  • Mipsel固件Fuzzing小记
  • 倒票“黄牛”屡禁不绝怎么破?业内:强化文旅市场票务公开制度
  • “GoFun出行”订单时隔7年扣费后续:平台将退费,双方已和解
  • 著名心血管病学专家李国庆教授逝世,享年63岁
  • 昆明公布3起经济犯罪案例:一人持有820余万假美元被判刑十年
  • 既是工具又是食物,可食用机器人开启舌尖上的新科技
  • 收到延期付款利息,该缴纳增值税吗?