Kotlin 作用域函数 - let 函数、run 函数

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)
}
  1. let 是泛型扩展函数

  2. 在配合 ?. 时,将调用者 T 对象作为参数传递给 Lambda,在 Lambda 内部通过 it 访问,避免空指针

  3. 如果不配合 ?.,it 可能为 null

  4. 返回 Lambda 的执行结果 R

  5. 通过 inline 关键字内联,避免函数对象开销(让编译器直接把代码"复制粘贴"到调用处,而不是真的创建一个函数对象去调用)

2、演示
  1. 这里会执行,因为对象不为 null
kotlin 复制代码
var str: String? = "Hello, Kotlin!"

str?.let {
    println(it.length)
}

println("结束")
复制代码
# 输出结果

14
结束
  1. 这里不会执行,因为对象为 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()
}
  1. run 是一个作用域函数,接收一个 lambda 表达式并在其作用域内执行

  2. run 函数分为扩展函数与非扩展函数,扩展函数对调用者 T 执行 lambda,内部通过 this 访问上下文,返回 lambda 结果,非扩展函数是独立作用域,无需上下文对象

  3. run 函数通过 inline 关键字内联,避免函数对象开销

2、演示
  1. 创建独立作用域
kotlin 复制代码
val result = run {
    val x = 10
    val y = 20
    x + y
}

println(result)
复制代码
# 输出结果

30
  1. 使用临时变量
kotlin 复制代码
val value = 100

val processed = run {
    val value = 50
    value * 2
}

println("外部 value: $value")
println("计算结果: $processed")
复制代码
# 输出结果

外部 value: 100
计算结果: 100
  1. 对象配置与计算
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
  1. 空安全检查
kotlin 复制代码
val content: String? = "Hello"

val length = content?.run {
    println("字符串: $this")
    length
} ?: 0

println(length)
复制代码
# 输出结果

字符串: Hello
5
相关推荐
GIS阵地10 分钟前
QgsRasterDataProvider 完整详解(QGIS 3.40.13 C++)
开发语言·c++·qt·开源软件·qgis
-SOLO-32 分钟前
停止gradle命令
android
fīɡЙtīиɡ ℡34 分钟前
布隆过滤器
java
_祝你今天愉快41 分钟前
Android Binder 驱动 - 启动 ServiceManager 进程
android
农村小镇哥1 小时前
ThinkPHP-MVC什么是框架
android
yaoxin5211231 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python
阿里嘎多学长1 小时前
2026-07-14 GitHub 热点项目精选
开发语言·程序员·github·代码托管
换元不配限1 小时前
Jetpack Compose 状态管理指南
android·状态管理·compose·状态·单向数据流·jetpack compose·状态容器
charlie1145141912 小时前
Cinux: 为大内核铺路
开发语言·c++·操作系统·现代c++
2501_914245932 小时前
C语言设计模式详解:从理论到实践的完整指南
c语言·开发语言·设计模式