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
相关推荐
肖恩想要年薪百万4 分钟前
JSP中常用JSTL标签
java·开发语言·状态模式
l1t15 分钟前
在aarch64机器上安装clang来生成codonjit python模块
开发语言·python
程序员清风18 分钟前
AI开发岗该如何准备面试?
java·后端·面试
笨拙的老猴子30 分钟前
Spring AI 实战教程(七):Agent 智能体 —— 用电商购物助手学透自主规划与工具执行
java·人工智能·spring
谙弆悕博士32 分钟前
快速学C语言——第19章:C语言常用开发库
c语言·开发语言·算法·业界资讯·常用函数
月落归舟33 分钟前
深入解析Java基础之基础
java·开发语言
折哥的程序人生 · 物流技术专研34 分钟前
《Java 100 天进阶之路》第20篇:Java初始化、构造器、对象创建的过程
java·开发语言·后端·面试
南宫萧幕38 分钟前
基于 Simulink 与 Python 联合仿真的 eVTOL 强化学习全链路实战
开发语言·人工智能·python·算法·机器学习·控制
电魂泡哥40 分钟前
CMS垃圾回收
java·jvm·算法
csbysj20201 小时前
Perl 运算符
开发语言