Z
ZHANK
实用技巧

作用域函数

let/run/with/apply/also 五种作用域函数对比与选择

作用域函数

let/run/with/apply/also 五种作用域函数——选对能让代码更 Kotlin 风。

学完本章你将: 掌握五种的对比和选择指南。


五种一览

kotlin
data class Person(var name: String, var age: Int)

val p = Person("小明", 25)

// let:it 参数,返回 lambda 结果
p.let { println(it); it.name }               // → "小明"

// run:this 接收者,返回 lambda 结果
p.run { println(name); age }                 // → 25

// with:非扩展,this 接收者
with(p) { println("$name, $age") }           // → Unit

// apply:this 接收者,返回 this 自身
p.apply { age = 26 }                         // → p(age已改为26)

// also:it 参数,返回 this 自身
p.also { println("处理: ${it.name}") }       // → p

选择指南

kotlin
// 对非空对象执行操作 → let
name?.let { println(it.length) }

// 初始化对象 → apply
val user = User().apply {
    name = "小明"
    age = 25
}

// 对象配置并计算结果 → run
val result = service.run {
    connect()
    fetchData()
}

// 需要对象本身但执行副作用 → also
list.also { println("共 ${it.size} 条") }
    .map { it * 2 }

速查表

函数接收者返回值场景
letitlambda结果空安全/转换
runthislambda结果配置+计算
withthislambda结果多方法调用
applythisthis初始化
alsoitthis副作用/日志