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

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

相关推荐
叶羽西1 天前
Android15 EVS HAL中使用Camera HAL Provider接口
android
2501_915918411 天前
除了 Perfdog,如何在 Windows 环境中完成 iOS App 的性能测试工作
android·ios·小程序·https·uni-app·iphone·webview
泓博1 天前
Android状态栏文字图标设置失效
android·composer
叶羽西1 天前
Android15系统中(娱乐框架和车机框架)中对摄像头的朝向是怎么定义的
android
Java小白中的菜鸟1 天前
安卓studio链接夜神模拟器的一些问题
android
莫比乌斯环1 天前
【Android技能点】深入解析 Android 中 Handler、Looper 和 Message 的关系及全局监听方案
android·消息队列
编程之路从0到11 天前
React Native新架构之Android端初始化源码分析
android·react native·源码阅读
行稳方能走远1 天前
Android java 学习笔记2
android·java
编程之路从0到11 天前
React Native 之Android端 Bolts库
android·前端·react native
爬山算法1 天前
Hibernate(38)如何在Hibernate中配置乐观锁?
android·java·hibernate