0Pricing
Android Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 可空类型与非空类型
  2. 安全调用与 Elvis
  3. let、also 与作用域函数
  4. 避免 NullPointerExceptions
← 返回 Android Academy