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 小时前
【Android 美颜相机】第二十三天:GPUImageDarkenBlendFilter(变暗混合滤镜)
android·数码相机
小天源3 小时前
银河麒麟 V10(x86_64)离线安装 MySQL 8.0
android·mysql·adb·麒麟v10
2501_915921434 小时前
傻瓜式 HTTPS 抓包,简单抓取iOS设备数据
android·网络协议·ios·小程序·https·uni-app·iphone
csj505 小时前
安卓基础之《(20)—高级控件(2)列表类视图》
android
JMchen1235 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
恋猫de小郭6 小时前
Flutter 在 Android 出现随机字体裁剪?其实是图层合并时的边界计算问题
android·flutter·ios
2501_915918417 小时前
把 iOS 性能监控融入日常开发与测试流程的做法
android·ios·小程序·https·uni-app·iphone·webview
benjiangliu8 小时前
LINUX系统-09-程序地址空间
android·java·linux
独自破碎E8 小时前
字符串相乘
android·java·jvm
DokiDoki之父8 小时前
边写软件边学kotlin(一):Kotlin语法初认识:
android·开发语言·kotlin