Kotlin中的let、run、with、also、apply、invoke用法详解

以下是 Kotlin 中作用域函数(letrunwithalsoapply)和 invoke 操作符的完整总结,结合代码示例和对比说明,帮助您理解它们的用法和区别。


一、作用域函数:简化对象操作

作用域函数用于在对象的上下文中执行代码块,并根据函数的不同返回对象本身或 lambda 的结果。以下是它们的核心区别:

1. let

  • 引用对象it(默认参数名,可自定义)
  • 返回值:lambda 表达式的结果
  • 典型场景:非空对象操作、链式处理
kotlin 复制代码
val name: String? = "Kotlin"
val length = name?.let { 
    println("Name is $it")  // 输出: Name is Kotlin
    it.length              // 返回结果
}
println(length)  // 输出: 6

2. run

  • 两种形式
    • 扩展函数形式 :使用 this 引用对象,返回 lambda 结果。
    • 上下文对象形式:直接调用,返回 lambda 结果。
  • 典型场景:对象配置并返回计算结果。

扩展函数形式

kotlin 复制代码
data class Config(var host: String = "", var port: Int = 0)

val config = Config().run {
    host = "127.0.0.1"  // this.host(this 可省略)
    port = 8080
    "$host:$port"       // 返回结果
}
println(config)  // 输出: 127.0.0.1:8080

上下文对象形式

kotlin 复制代码
val result = run {
    val x = 2
    val y = 3
    x + y  // 返回结果
}
println(result)  // 输出: 5

3. with

  • 非扩展函数 :需传入对象,使用 this 引用。
  • 返回值:lambda 表达式的结果
  • 典型场景:对已有对象执行多个操作。
kotlin 复制代码
val list = mutableListOf("A", "B")
with(list) {
    add("C")
    remove("A")
    "Size: ${size}"  // 返回结果
}
println(list)  // 输出: [B, C]

4. also

  • 引用对象it
  • 返回值:对象本身
  • 典型场景:附加操作(如日志、副作用)。
kotlin 复制代码
val file = File("test.txt").also {
    it.writeText("Hello")  // 操作对象
}.also {
    println("File created: ${it.name}")  // 附加日志
}

5. apply

  • 引用对象this
  • 返回值:对象本身
  • 典型场景:对象初始化配置。
kotlin 复制代码
val button = Button().apply {
    text = "Click Me"
    color = Color.BLUE
    onClick { showToast() }
}

二、invoke 操作符:让对象像函数一样调用

invoke 是一个特殊操作符,允许对象通过 () 直接调用,类似函数行为。

1. 自定义类的 invoke

kotlin 复制代码
class Adder(private val base: Int) {
    operator fun invoke(x: Int) = base + x
}

val add5 = Adder(5)
println(add5(3))  // 输出: 8(等价于 add5.invoke(3))

2. 函数类型变量调用

kotlin 复制代码
val multiply: (Int, Int) -> Int = { a, b -> a * b }
println(multiply(4, 5))  // 输出: 20(等价于 multiply.invoke(4, 5))

三、对比总结

函数/操作符 引用对象 返回值 典型场景
let it Lambda 结果 非空操作、链式处理
run this Lambda 结果 对象配置并返回结果
with this Lambda 结果 对已有对象执行多操作
also it 对象本身 附加操作(日志、副作用)
apply this 对象本身 对象初始化
invoke - 自定义返回值 让对象像函数一样被调用

四、选择指南

  1. 需要返回对象本身

    • 初始化对象apply
    • 附加操作also
  2. 需要返回计算结果

    • 操作非空对象let
    • 对象配置并返回结果runwith
  3. 简化函数调用invoke

通过合理使用这些特性,可以显著提升代码的简洁性和可读性,遵循 Kotlin 的惯用风格。

相关推荐
alexhilton1 天前
Android的Agent优先时代:构建时vs运行时
android·kotlin·android jetpack
Cutecat_1 天前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
2601_961765291 天前
【分享】PlayerPro媒体音乐播放器 完整专业版
android·媒体
JohnnyDeng941 天前
【Android】Android 包体积优化:R8/ProGuard 深度配置全攻略
android·性能优化·kotlin·jetpack
故渊at1 天前
第九板块:Android 多媒体体系 | 第二十四篇:Camera Service 与 HAL3 成像流水线
android·camera·多媒体体系·hal3
Jinkxs1 天前
Python基础 - 初识内置函数 Python自带的便捷工具
android·java·python
私人珍藏库1 天前
【Android】VLLO-韩国热门手机剪辑APP
android·app·工具·软件·多功能
Cloud_Shy6181 天前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
AFinalStone1 天前
Android12 U盘插拔链路源码全解析(五):Framework层(下) StorageManagerService
android·frameworks
林九生1 天前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql