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
相关推荐
懂点Tech11 分钟前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
云和数据.ChenGuang29 分钟前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠39 分钟前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
美狐美颜SDK开放平台1 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
dtq04241 小时前
C++小案例 - 日志实战
开发语言·c++
tongyiixiaohuang2 小时前
WMS已发货状态反写金蝶云星空:单策略实战教程
android
星夜离尘562 小时前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
码匠许师傅2 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
好的佩奇2 小时前
Dart 之类修饰符
android·flutter·dart
码匠许师傅3 小时前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++