Kotlin内置函数let、run、apply的区别

序、慢慢来才是最快的方法。

Kotlin 中的 letrunapply 都是 Scope Functions(作用域函数),用于限定一个代码块的作用域。它们的区别在于返回值和使用场景上。

let函数

源码:

Kotlin 复制代码
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

使用:

Kotlin 复制代码
    intent.extras?.let {
            shareId = it.getInt(Constant.CONTENT_ID_KEY, -1)
            shareTitle = it.getString(Constant.CONTENT_TITLE_KEY, "")
            shareUrl = it.getString(Constant.CONTENT_URL_KEY, "")
        }
  • let 函数是将一个对象作为 lambda 表达式的参数,在 lambda 表达式内部可以通过 it 引用这个对象。它的返回值是 lambda 表达式的执行结果。
  • 由于 let 函数的返回值就是 lambda 表达式的执行结果,所以我们可以继续链式调用另一个 let 函数,并在其内部打印出转换后的字符串。
  • let 函数适合对一个对象进行一系列处理,并返回处理结果的场景。

run函数

源码:

Kotlin 复制代码
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

使用:

Kotlin 复制代码
 toolbar.run {
            title = resources.getString(R.string.login)
            setSupportActionBar(this)
            supportActionBar?.setDisplayHomeAsUpEnabled(true)
        }
  • run 函数是将一个对象作为 lambda 表达式的接收者,在 lambda 表达式内部可以通过 this 或省略掉 this 直接访问对象的方法和属性。它的返回值是 lambda 表达式的执行结果。
  • run 函数适合对一个对象进行一系列处理,并返回处理结果的场景。它和 let 函数的不同在于,run 函数将 lambda 表达式的执行结果作为返回值,而 let 函数将 lambda 表达式的参数作为返回值。

apply函数

源码

Kotlin 复制代码
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

使用

Kotlin 复制代码
 toolbar.apply {
            title = ""//getString(R.string.loading)
            setSupportActionBar(this)
            supportActionBar?.setDisplayHomeAsUpEnabled(true)
        }
  • apply 函数是将一个对象作为 lambda 表达式的接收者,在 lambda 表达式内部可以通过 this 或省略掉 this 直接访问对象的方法和属性。它的返回值是对象本身。
  • apply 函数适合对一个对象进行一系列操作,例如初始化对象的属性,而不需要返回结果的场景。因为它返回的是对象本身,所以可以使用链式调用。

run和apply的区别

  • run函数返回最后一行的值/表达式
  • apply函数返回传入的对象的本身
相关推荐
石山岭18 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧20 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
唐青枫1 天前
别再把 inline 当性能开关:Kotlin 内联、noinline、crossinline 与 reified 实战详解
kotlin
Kapaseker1 天前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
黄林晴1 天前
AndroidX 官宣信号:Compose版WebView要来了!
kotlin
三少爷的鞋1 天前
Android 现代架构不需要事件总线进阶篇
android
杉氧2 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏2 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧2 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄2 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android