题目
Kotlin标准函数let与apply的区别及使用场景
信息
- 类型:问答
- 难度:⭐
考点
Kotlin标准函数,作用域函数,空安全处理
快速回答
let和apply都是Kotlin标准库中的作用域函数,主要区别:
- 返回值不同:let返回lambda表达式结果,apply返回上下文对象本身
- 访问对象方式不同:let使用
it访问对象,apply使用this - 适用场景不同:let适合空检查和转换操作,apply适合对象初始化和配置
1. 核心区别对比
| 函数 | 返回值 | 上下文对象访问 | 典型使用场景 |
|---|---|---|---|
let | Lambda结果 | it | 空安全检查、数据转换 |
apply | 对象本身 | this | 对象初始化、属性配置 |
2. 代码示例说明
// let示例:空安全转换
val name: String? = "Kotlin"
val length = name?.let {
println("Processing: $it")
it.length // 返回字符串长度
} ?: 0
// apply示例:对象初始化
val textView = TextView(context).apply {
text = "Hello" // this.text可省略this
textSize = 16f
setTextColor(Color.BLACK)
} // 返回已配置的TextView对象3. 使用场景详解
- let适用场景:
- 对可空对象进行安全操作:
obj?.let { /* 非空时执行 */ } - 将对象转换为其他值:
val len = str.let { it.length } - 限制局部变量作用域
- 对可空对象进行安全操作:
- apply适用场景:
- 对象初始化配置(替代Java的Builder模式)
- 链式调用中配置属性:
RecyclerView(context).apply { layoutManager = ... } - 创建并立即配置对象
4. 常见错误
- 混淆返回值:在apply中误用return返回lambda结果(实际返回对象本身)
- 错误空检查:
let未配合安全调用符?.导致NPE - 过度嵌套:多层作用域函数嵌套降低可读性
5. 最佳实践
- 优先使用
let处理可空对象避免if (obj != null) - 使用
apply集中配置新创建对象 - 避免在单个作用域函数中编写复杂逻辑(超过5行)
- 链式调用时注意返回值类型匹配
6. 扩展知识
- 其他作用域函数:
run:结合let和apply特性,返回lambda结果also:类似let但返回对象本身with:非扩展函数,适合对象分组操作
- 性能提示:标准函数内联编译(无运行时开销)