在 Kotlin 中,let、with、run、apply 和 also 是五个非常常用的标准函数。它们都属于 Kotlin 的 作用域函数,用于提升代码可读性、避免重复、简化 null 判断等。
总览对比表
但初学时常常会混淆它们的区别:到底什么时候用哪个?它们的接收对象是哪个?返回值又是什么? 这篇文章将从 区别、和使用场景,两个维度来学习它们的本质和应用。
函数 | 接收对象(this / it) | 返回值 | 主要用途 |
---|---|---|---|
let |
it |
Lambda 表达式结果 | 作用域限制、null 安全、链式操作 |
run |
this |
Lambda 表达式结果 | 执行表达式并返回结果 |
with |
this |
Lambda 表达式结果 | 同 run ,但是函数调用形式 |
apply |
this |
接收对象本身 | 初始化对象属性 |
also |
it |
接收对象本身 | 做副作用处理,如日志打印 |
经典使用场景
1. let ------ Null 安全调用
java
val name: String? = "Alice"
val upperCaseName = name?.let {
println("用户名是:${it.uppercase()}")
it.uppercase()
}
接收it,返回Lambda 表达式结果
经典场景:Null 安全处理、链式转换
2. run ------ 执行块并返回结果(局部作用域执行)
java
val result = "Kotlin".run {
println("字符串长度:$length")
length * 2
}
接收this,返回Lambda 表达式结果
经典场景:执行并返回表达式结果
3. with ------ 对已有对象进行多次操作
java
val builder = StringBuilder()
val result = with(builder) {
append("Hello, ")
append("world!")
toString()
}
接收this,返回Lambda 表达式结果
经典场景:对已有对象连续操作
4. apply ------ 初始化对象属性(配置对象)
java
val paint = Paint().apply {
color = Color.RED
strokeWidth = 5f
style = Paint.Style.FILL
}
接收this,返回接收对象本身
经典场景:初始化对象属性(构建对象)
5. also ------ 添加副作用处理而不影响主流程
java
val list = mutableListOf("A", "B", "C")
.also { println("初始列表:$it") }
.apply { add("D") }
接收it,返回接收对象本身
经典场景:插入副作用逻辑(日志/调试)