题目
Kotlin 标准函数 let 和 also 的区别与使用场景
信息
- 类型:问答
- 难度:⭐
考点
作用域函数,空安全处理,代码简洁性
快速回答
let 和 also 都是 Kotlin 的标准作用域函数,主要区别在于:
- 返回值不同:let 返回 lambda 表达式结果,also 返回上下文对象本身
- 使用场景不同:let 常用于转换或处理对象,also 适合执行副作用操作
- 空安全:两者都支持安全调用操作符(?.)避免空指针异常
1. 核心原理
let 和 also 是 Kotlin 标准库中的作用域函数,通过 lambda 表达式在对象上下文中执行代码块:
// 函数定义
public inline fun <T, R> T.let(block: (T) -> R): R
public inline fun <T> T.also(block: (T) -> Unit): T2. 关键区别
| 函数 | 返回值 | 对象引用 | 典型使用场景 |
|---|---|---|---|
| let | lambda 结果 | it | 对象转换、空安全检查 |
| also | 对象本身 | it | 日志打印、属性初始化 |
3. 代码示例
// let 示例:转换数据并返回新结果
val upperName = user?.let {
it.name.uppercase() // 返回转换后的值
}
// also 示例:初始化对象并返回原对象
val file = File("log.txt").also {
it.setWritable(true) // 执行副作用操作
it.appendText("Start log")
}4. 最佳实践
- 使用 let:当需要处理可空对象或转换数据时
user?.let { sendEmail(it) } // 安全调用非空对象 - 使用 also:当需要调试或初始化对象属性时
recyclerView.adapter = MyAdapter().also { it.setHasStableIds(true) } - 避免嵌套多层作用域函数(超过2层应重构)
5. 常见错误
- 混淆返回值导致逻辑错误:
val size = list.also { it.size } // 错误!返回list对象而非size - 过度使用 it 导致可读性下降(复杂逻辑中建议显式命名)
- 在 also 中意外修改关键对象状态
6. 扩展知识
- with:非扩展函数,适合对象配置
with(recyclerView) { adapter = MyAdapter() } - apply:返回对象本身,适合初始化
TextView(context).apply { textSize = 16f } - run:结合 let 和 with 的特性
val result = service.run { fetchData() }