Kotlin 中,run、also、let、apply、with 是常用的作用域函数

在 Kotlin 中,runalsoletapplywith是常用的作用域函数,它们可以简化代码并提供更优雅的操作方式。这些函数的主要区别在于返回值上下文对象的引用方式this 还是 it)。

1. let

  • 上下文对象引用 :使用 it 关键字

  • 返回值:lambda 表达式的最后一行结果

  • 适用场景 :对非空对象进行操作、转换对象、避免重复使用安全调用运算符(?.

kotlin

kotlin 复制代码
val str: String? = "Hello"
val length = str?.let { 
    println("字符串是:$it")  // it 指代 str 的非空值
    it.length  // 返回长度
}
println("长度:$length")  // 输出:长度:5

2. run

  • 上下文对象引用 :使用 this 关键字(可省略)

  • 返回值:lambda 表达式的最后一行结果

  • 适用场景:需要同时访问对象的多个属性 / 方法,并且需要返回结果

kotlin

kotlin 复制代码
val person = Person("Alice", 25)
val info = person.run {
    println("姓名:$name")  // this 可省略,直接访问属性
    println("年龄:$age")
    "姓名:$name,年龄:$age"  // 返回拼接的字符串
}
println(info)  // 输出:姓名:Alice,年龄:25

3. apply

  • 上下文对象引用 :使用 this 关键字(可省略)

  • 返回值:上下文对象本身

  • 适用场景:对象初始化、配置对象属性(常用于构建者模式)

kotlin

scss 复制代码
val list = mutableListOf<Int>().apply {
    add(1)
    add(2)
    add(3)  // 配置列表
}
println(list)  // 输出:[1, 2, 3](返回列表本身)

4. also

  • 上下文对象引用 :使用 it 关键字

  • 返回值:上下文对象本身

  • 适用场景:附加操作(如日志打印、调试),不改变对象但需要使用对象

kotlin

scss 复制代码
val numbers = listOf(1, 2, 3)
val result = numbers.also {
    println("原始列表:$it")  // 打印日志(附加操作)
}.map { it * 2 }  // 继续操作

println(result)  // 输出:[2, 4, 6]

5. with

  • 上下文对象引用 :作为参数传入,使用 this 关键字(可省略)

  • 返回值:lambda 表达式的最后一行结果

  • 适用场景 :与 run 类似,但 with 是独立函数,不是扩展函数

kotlin

kotlin 复制代码
val book = Book("Kotlin 入门", "张三")
val bookInfo = with(book) {
    "书名:$title,作者:$author"  // this 可省略
}
println(bookInfo)  // 输出:书名:Kotlin 入门,作者:张三

总结对比表

函数 上下文引用 返回值 典型用途
let it lambda 结果 非空操作、对象转换
run this lambda 结果 访问多个属性并返回结果
apply this 上下文对象本身 对象初始化、属性配置
also it 上下文对象本身 附加操作(日志、调试)
with this lambda 结果 访问对象属性(非扩展函数)

选择合适的函数可以使代码更简洁、可读性更高,根据具体场景和需求来决定使用哪一个即可。

相关推荐
JohnnyDeng942 小时前
【Android】Android 包体积优化:R8/ProGuard 深度配置全攻略
android·性能优化·kotlin·jetpack
故渊at2 小时前
第九板块:Android 多媒体体系 | 第二十四篇:Camera Service 与 HAL3 成像流水线
android·camera·多媒体体系·hal3
Jinkxs6 小时前
Python基础 - 初识内置函数 Python自带的便捷工具
android·java·python
私人珍藏库6 小时前
【Android】VLLO-韩国热门手机剪辑APP
android·app·工具·软件·多功能
Cloud_Shy6187 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
AFinalStone7 小时前
Android12 U盘插拔链路源码全解析(五):Framework层(下) StorageManagerService
android·frameworks
林九生9 小时前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql
故渊at10 小时前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈
aqi0010 小时前
一文速览 HarmonyOS 6.1.1 推出的十个新特性
android·华为·harmonyos·鸿蒙·harmony
matrixmind110 小时前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他