Kotlinlet 关键字是几个Kotlin范围函数关键字中的一个。
Kotlin中的范围函数关键字允许你在对象的上下文中执行一个代码块。
使用范围函数可以使你的代码更加简洁和可读。
例如,假设你有一个User 类,其定义如下:
class User(var username: String, var isActive: Boolean) {
fun hello() {
println("Hello! I'm $username")
}
}
通常实例化一个User 对象的方法是声明一个新的变量,如下图所示:
val user = User("Nathan", true)
user.hello() // Hello! I'm Nathan
user.username = "Jack"
user.hello() // Hello! I'm Jack
通过使用let 关键字,你可以省略将返回的User 对象分配给该变量。
下面的代码示例的输出与上面的相同:
User("Nathan", true).let {
it.hello() // Hello! I'm Nathan
it.username = "Jack"
it.hello() // Hello! I'm Jack
}
不需要初始化一个新的变量,你可以在let 关键字中使用lambda表达式直接调用生成的User 对象的方法和属性。
你调用let 函数的对象可以通过使用it 关键字在let 内访问:
User("Nathan", true).let {
println(it.username) // Nathan
println(it.isActive) // true
}
let 关键字返回你在代码块内定义的lambda表达式的结果。
在上面的例子中,lambda表达式没有返回任何东西,所以它返回一个Unit 类型:
val unit = User("Nathan", true).let {
it.hello() // Hello! I'm Nathan
it.username = "Jack"
it.hello() // Hello! I'm Jack
}
println(unit is Unit) // true
要返回除Unit 以外的东西,你的let 代码块内的最后一行代码必须返回一个值。
例如,你可以返回username 属性的length 值:
val usernameLength = User("Nathan", true).let {
it.hello()
it.username = "Jack"
it.username.length
}
println(usernameLength) // 4
如果上面的it.username.length 不在代码块的最后一行,let 仍然会返回一个Unit ,而不是一个Int 的值。
最后,let 关键字也可以在任何Kotlin内置对象上调用,比如String 或Boolean 。
当你有一个nullable类型的变量时,这特别有用。你只需要用?. 符号执行一次安全调用:
val name: String? = "Nathan"
name?.let {
println(it.length) // 6
println(it.lastIndex) // 5
}
在不使用let 的情况下,你需要在调用length 和lastIndex 属性之前添加安全调用符号?. ,如下所示:
val name: String? = "Nathan"
println(name?.length)
println(name?.lastIndex)
现在你已经学会了let 关键字在Kotlin中的作用。非常好!👍