let、also 与作用域函数
处理可空值。
let、also 与作用域函数 是 CoddyKit 上的免费 Android Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
什么是作用域函数
作用域函数让您可以在某个对象的上下文中运行一段代码。它们能让代码更加简洁,尤其适用于处理可空值。
本课重点介绍 let 和 also 这两个对空安全最有用的函数,以及它们与安全调用运算符的关系。
let 函数
let 会运行一段代码,并将对象作为 it 传入。它会返回代码块返回的任何内容。
它非常适合转换值,或为临时名称限定作用域。
fun main() {
val length = "Kotlin".let { it.length }
println(length) // prints: 6
}使用 let 实现空安全
将 ?. 与 let 结合使用,可以仅在值不为 null 时执行代码块。代码块会运行一次,并将该值作为 it。
如果值为 null,代码块会被完全跳过。
fun main() {
val name: String? = "Ada"
name?.let {
println("Hello, " + it)
}
}为 null 时跳过
当接收者为 null 时,?.let 不执行任何操作。代码块永远不会运行。
由于 name 为 null,此程序不会打印任何内容。
fun main() {
val name: String? = null
name?.let {
println("Hello, " + it)
}
}重命名 it
您可以为参数指定一个更清晰的名称,而不是使用 it。这样可以提高较长代码块的可读性。
使用箭头可以显式地为它命名。
val name: String? = "Bo"
name?.let { value ->
println(value.uppercase())
}also 函数
also 同样会将对象作为 it 传入,但它返回的是原始对象,而不是代码块的结果。
它非常适合在保持值不变的同时执行日志记录等副作用操作。
fun main() {
val n = 5.also { println("got " + it) }
println(n) // prints: 5
}let 与 also 的返回值
关键区别在于:let 返回代码块的结果,而 also 返回原始对象。
需要转换值时选择 let;只想查看值而不改变它时选择 also。
val a = "hi".let { it.length } // a = 2 (Int)
val b = "hi".also { it.length } // b = "hi" (String)使用 also 进行日志记录
由于 also 会返回对象,因此可以将它插入调用链中,在流程中途查看某个值。
这里仅当可空值存在时记录它,然后继续使用该值。
fun main() {
val token: String? = "abc"
val result = token?.also { println("token: " + it) }
println(result)
}let 与 Elvis 运算符
将 ?.let 与 Elvis 运算符结合,可以在值为 null 时提供替代方案。
值存在时,代码块会生成结果;为 null 时,则由 Elvis 运算符的另一侧处理。
fun main() {
val raw: String? = null
val out = raw?.let { it.trim() } ?: "empty"
println(out) // prints: empty
}选择作用域函数
为了实现空安全,当您想在代码块中转换或使用非 null 值时,请选择 let。当您想执行副作用操作但必须保留原始对象时,请选择 also。
两者都可以自然地与安全调用运算符结合,避免因 null 导致崩溃。
user?.let { save(it) } // transform/use
user?.also { log(it) } // side effect, keep user综合示例
此程序使用 ?.let 构建消息,并使用 Elvis 运算符提供备用结果。它展示了 Kotlin 中日常使用空安全的方式。
代码中没有显式的 null 检查,但仍然完全安全。
fun main() {
val city: String? = "Goreme"
val label = city?.let { "City: " + it } ?: "Unknown"
println(label)
}快速检查
测试您对 let 和 also 的理解。
回顾
作用域函数会在对象的上下文中运行代码块。let 将对象作为 it 传入,并返回代码块的结果;also 传入 it,并返回原始对象。
使用 ?.let 可以仅在值不为 null 时对其进行操作。接下来,您将综合这些概念,彻底避免 NullPointerExceptions。
常见问题解答
「let、also 与作用域函数」课时是免费的吗?
是的 — 「let、also 与作用域函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「let、also 与作用域函数」这节课中我会学到什么?
处理可空值。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「let、also 与作用域函数」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 可空类型与非空类型
- 安全调用与 Elvis
- let、also 与作用域函数
- 避免 NullPointerExceptions