AI面试总结:Java注解简介
前言 简单记录一下Java面试中注解(Annotation...
简单记录一下Kotlin面试中涉及let相关的知识点,记录于此,方便自己查阅和学习。
顺便对比一下run,apply,also的差异。
let是一个 作用域函数(Scope Function),用于 在对象上下文中执行代码块,并返回 Lambda 的结果。
val result = obj.let { it.doSomething() 123 }
| 特性 | 说明 |
|---|---|
| 上下文对象 | it |
| 返回值 | Lambda 的返回值 |
| 是否改变原对象 | 不改变 |
| 常见用途 | 空安全处理、链式调用 |
val name: String? = null name?.let { println(it.length) }
为什么不用 if (name != null)?
回答:
- let更简洁
- 自动完成非空分支
- 作用域内类型自动转为非空
| 函数 | 上下文 | 返回值 | 典型场景 |
|---|---|---|---|
| let | it | Lambda 结果 | 空判断、映射 |
| run | this | Lambda 结果 | 计算、初始化 |
| apply | this | 对象本身 | 对象配置 |
| also | it | 对象本身 | 日志、副作用 |
示例:
val a = user?.let { it.name } // 返回 name val b = user?.run { this.name } // 返回 name val c = user?.apply { name = "Tom" } // 返回 user val d = user?.also { log(it) } // 返回 user
选择哪个函数,取决于你是想“返回对象”还是“返回结果”,以及喜欢 it还是 this。
| 对比点 | let | run |
|---|---|---|
| 函数类型 | (T) -> R | T.() -> R |
| 上下文对象 | it | this |
| 是否可省略 | 不能省 | 可省略 |
| 更像 | 普通函数 | 成员函数 |
val user = User("Tom") user.let { println(it.name) } user.run { println(name) // 等价于 this.name }
user.run {
name = "Tom"
age = 18
}val x = listOf(1, 2, 3).let { it.size it }
返回值是 it 的值
Kotlin中所有代码块都有返回值,最后一个表达式即返回值。
不会
public inline fun <T, R> T.let(block: (T) -> R): Rlet是内联函数,没有运行时开销,适合频繁使用。
滥用let导致可读性下降
user?.let { it.address?.let { it.city?.let { println(it) } } }
更好的写法:
user?.address?.city?.let { println(it) }
let应提升可读性,而不是嵌套地狱。
let是 Kotlin 中最常用的作用域函数,主要用于 空安全处理和结果映射,通过 it访问对象,返回 Lambda 结果,并且是内联函数,无性能损耗。