let 函数
1、基本介绍
kotlin
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
-
let 是泛型扩展函数
-
在配合
?.时,将调用者 T 对象作为参数传递给 Lambda,在 Lambda 内部通过 it 访问,避免空指针 -
如果不配合
?.,it 可能为 null -
返回 Lambda 的执行结果 R
-
通过 inline 关键字内联,避免函数对象开销(让编译器直接把代码"复制粘贴"到调用处,而不是真的创建一个函数对象去调用)
2、演示
- 这里会执行,因为对象不为 null
kotlin
var str: String? = "Hello, Kotlin!"
str?.let {
println(it.length)
}
println("结束")
# 输出结果
14
结束
- 这里不会执行,因为对象为 null
kotlin
var str: String? = null
str?.let {
println(it.length)
}
println("结束")
# 输出结果
结束
run 函数
1、基本介绍
kotlin
@kotlin.internal.InlineOnly
public inline fun <R> run(block: () -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
kotlin
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
-
run 是一个作用域函数,接收一个 lambda 表达式并在其作用域内执行
-
run 函数分为扩展函数与非扩展函数,扩展函数对调用者 T 执行 lambda,内部通过 this 访问上下文,返回 lambda 结果,非扩展函数是独立作用域,无需上下文对象
-
run 函数通过 inline 关键字内联,避免函数对象开销
2、演示
- 创建独立作用域
kotlin
val result = run {
val x = 10
val y = 20
x + y
}
println(result)
# 输出结果
30
- 使用临时变量
kotlin
val value = 100
val processed = run {
val value = 50
value * 2
}
println("外部 value: $value")
println("计算结果: $processed")
# 输出结果
外部 value: 100
计算结果: 100
- 对象配置与计算
kotlin
data class Person(var name: String, var age: Int)
val person = Person("Alice", 25)
val result = person.run {
age += 1
name = "$name Smith"
"姓名: $name, 年龄: $age"
}
println(result)
# 输出结果
姓名: Alice Smith, 年龄: 26
- 空安全检查
kotlin
val content: String? = "Hello"
val length = content?.run {
println("字符串: $this")
length
} ?: 0
println(length)
# 输出结果
字符串: Hello
5