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 结果 访问对象属性(非扩展函数)

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

相关推荐
renxhui10 分钟前
Dart 速通攻略(面向 Android 工程师)
android·flutter·dart
Frank_HarmonyOS11 分钟前
MVI模式
android
m***98212 分钟前
Redis6.2.6下载和安装
android·前端·后端
未来之窗软件服务32 分钟前
幽冥大陆(三十九)php二维数组去重——东方仙盟筑基期
android·开发语言·算法·php·仙盟创梦ide·东方仙盟·东方仙盟sdk
w***4241 小时前
【mysql部署】在ubuntu22.04上安装和配置mysql教程
android·mysql·adb
e***75391 小时前
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
android·sql·mysql
道路与代码之旅1 小时前
“变量也能是函数?——论 Kotlin 中那些会说话的变量,以及它们如何让代码少说废话”
android·开发语言·kotlin
x***01061 小时前
Mysql之主从复制
android·数据库·mysql
千码君20161 小时前
kotlin:基础类型的扩展函数有什么特点?
kotlin·工具类·this·扩展函数·接收者·安全类型·字符串验证
千里马学框架1 小时前
wms开发常用调试开发技巧之WMShell的实用命令
android·framework·wms·安卓framework开发·systemui·proto·wmshell