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 小时前
MySQL中的空间碎片率计算分析
android·数据库·mysql
用户092 小时前
MVI架构如何改变Android开发模式
android·面试·kotlin
小孔龙2 小时前
K2 编译器 - Symbol(符号系统)
kotlin·编译器
梦终剧3 小时前
【Android之路】.sp和界面层次结构
android
2501_916008893 小时前
iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略
android·macos·ios·小程序·uni-app·cocoa·iphone
zh_xuan3 小时前
Android Handler源码阅读
android
雪饼android之路3 小时前
【Android】 android suspend/resume总结(3)
android·linux
00后程序员张3 小时前
iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动
android·ios·小程序·uni-app·swiftui·cocoa·iphone
molong9314 小时前
Android 应用配置跳转微信小程序
android·微信小程序·小程序
2501_915106324 小时前
iOS 可分发是已经上架了吗?深入解析应用分发状态、ipa 文件上传、TestFlight 测试与 App Store 审核流程
android·ios·小程序·https·uni-app·iphone·webview