Kotlin Academy · 课时

选择合适的作用域函数:决策指南

根据接收者、返回类型和意图选择正确的作用域函数。

第 4 / 4 课14 个步骤

选择合适的作用域函数:决策指南 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

五个函数,两个维度

Kotlin 的作用域函数有两个变化维度:接收者风格(this 或 it)和返回值(接收者或 Lambda 表达式的结果)。请根据意图进行选择。

决策矩阵

apply:this / 接收者。also:it / 接收者。run:this / Lambda 表达式。let:it / Lambda 表达式。with:this / Lambda 表达式(不通过点号使用接收者)。

apply:配置并返回

使用 apply 在构建器风格的链式调用中配置对象。

class Config {
    var host: String = ""
    var port: Int = 0
}
fun main() {
    val cfg = Config().apply {
        host = "localhost"
        port = 8080
    }
    println("${cfg.host}:${cfg.port}")
}

also:执行副作用操作

使用 also 记录日志、执行验证或触发副作用操作,同时继续传递接收者。

fun main() {
    val items = listOf(1, 2, 3, 4)
        .also { println("got ${it.size} items") }
        .filter { it % 2 == 0 }
    println(items)
}

let:转换并实现空安全作用域

使用 let 执行空安全转换,或限制变量的作用域。

fun main() {
    val name: String? = "Ada"
    val length = name?.let { it.length } ?: 0
    println(length)
}

run:使用多个成员访问并返回结果

当需要根据接收者的多个成员计算结果时,请使用 run,这样可以省略 it. 前缀。

class User(val name: String, val age: Int)
fun main() {
    val description = User("Ada", 35).run {
        "Name: $name, Age: $age"
    }
    println(description)
}

with:对现有对象执行分组操作

当您不控制调用位置(没有点号链),但希望使用 this 对操作进行分组时,请使用 with(obj) { ... }。

class Builder {
    val parts = mutableListOf<String>()
    fun add(s: String) { parts.add(s) }
    fun build(): String = parts.joinToString("-")
}
fun main() {
    val b = Builder()
    val result = with(b) {
        add("hello")
        add("kotlin")
        build()
    }
    println(result) // hello-kotlin
}

根据意图进行选择

请思考:(1)我需要返回接收者,还是需要派生结果?(2)我更喜欢使用 this 还是 it? 根据答案即可选择函数。

class Box { var w = 0; var h = 0; fun area() = w * h }
fun main() {
    // Configure and return Box -> apply
    val box = Box().apply { w = 3; h = 4 }
    // Compute area from box -> let or run
    val area = box.let { it.area() }
    // Side effect, keep box -> also
    val sameBox = box.also { println("area=${it.area()}") }
    println("$box / $area / $sameBox")
}

比较:apply 与 also

两者都会返回接收者。apply 使用 this(适合设置字段)。also 使用 it(适合显式引用接收者,通常用于副作用操作)。

class Item { var name = "" }
fun main() {
    val a = Item().apply { name = "apply" } // implicit this
    val b = Item().also { it.name = "also" } // explicit it
    println("${a.name} / ${b.name}")
}

比较:let 与 run

两者都会返回 Lambda 表达式的结果。let 使用 it(适合简单转换和空安全)。run 使用 this(适合调用多个成员)。

class Calculator(val a: Int, val b: Int) {
    fun sum() = a + b
    fun product() = a * b
}
fun main() {
    val calc = Calculator(3, 4)
    val s = calc.let { it.sum() }                  // simple
    val combo = calc.run { "sum=${sum()} product=${product()}" } // multi-member
    println("$s / $combo")
}

实际的链式流程

实际项目中的链式调用通常会组合使用多个作用域函数。

class Request(var url: String = "", var headers: Map<String, String> = emptyMap())
fun main() {
    val response = Request()
        .apply {
            url = "https://api.example.com"
            headers = mapOf("Accept" to "json")
        }
        .also { println("request: ${it.url}") }
        .let { req -> "GET ${req.url}" }
    println(response)
}

速查表

快速参考,帮助您选择合适的工具。

// apply: this, returns receiver — configure object
// also: it, returns receiver — side effects in chain
// let: it, returns lambda result — transform / null-safety
// run: this, returns lambda result — multi-member compute
// with: this, returns lambda result — group operations on existing obj
fun main() { println("Scope functions: pick by receiver style + return value") }

快速检查

哪个作用域函数将 this 作为接收者,并且返回接收者本身?

回顾

请根据意图选择作用域函数:apply(配置并返回自身)、also(执行副作用操作并返回自身)、let(使用 it 进行转换)、run(使用 this 进行转换)、with(对现有对象执行分组操作)。两个维度——接收者风格和返回值——决定了正确的选择。

免费开始

用 AI 导师学习 Kotlin — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
51
课程
203

常见问题解答

「选择合适的作用域函数:决策指南」课时是免费的吗?

是的 — 「选择合适的作用域函数:决策指南」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「选择合适的作用域函数:决策指南」这节课中我会学到什么?

根据接收者、返回类型和意图选择正确的作用域函数。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「选择合适的作用域函数:决策指南」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. apply 与 with:配置并返回
  2. let 与 run:转换与作用域
  3. also:不改变接收者的副作用操作
  4. 选择合适的作用域函数:决策指南
← 返回 Kotlin Academy