Kotlin 作用域函数(apply、also、run、let、takeIf)

在 Kotlin 中,作用域函数是一组用来在特定作用域中操作对象的函数。它们允许在给定作用域内 对对象进行属性赋值 、方法调用转换 等操作,并返回 相应的结果

Kotlin提供了几个常用的作用域函数:


apply:

apply 函数将对象作为上下文 (this),并允许在一个代码块中对对象进行属性赋值、方法调用等操作。最后返回对象本身。

Kotlin 复制代码
class Bean(var name: String, var age: Int)

fun main() {
    val bean = Bean("wk", 25)

    val result = bean.apply {  // 返回对象本身
        name = "红红"
        age = 16
    }
    println(result.name)  // 打印:红红
    println(result.age)   // 打印:16
}

这个在实际的开发工作当中运用得很广泛,比如说给数据 Bean 赋值。如果是 java 语言的话就要 set.. set.. 而 Kotlin 直接开启一个对象的作用域,在这个作用域内赋值,省略了很多冗余代码


also:

also 函数将对象作为 lambda 表达式的参数 (it),并允许在 lambda 表达式中对对象进行操作。最后返回对象本身。

Kotlin 复制代码
fun main() {
    val bean = Bean("wk", 25)

    val result = bean.also { // 返回对象本身
        it.name = "火火"
        it.age = 17
    }
    println(result.name)  // 打印:火火
    println(result.age)   // 打印:17
}

also 和 apply 一样是返回对象本身,但是 also 作用域内是 it,不是 this,所以 also 一般用 it 去调用别的函数会比较方便


run:

run 函数将对象作为上下文 (this),并允许在 lambda 表达式中直接访问对象的属性和方法。最后返回 lambda 表达式的结果。

Kotlin 复制代码
fun main() {
    val bean = Bean("wk", 25)

    val result = bean.run { // 返回最后一行
        name = "水水"
        50
    }
    println(result)    // 打印:50
    println(bean.name) // 打印:水水
}

let:

let 函数将对象作为 lambda 表达式的参数 (it),并允许在 lambda 表达式中对对象进行操作,如转换、处理等。最后返回 lambda 表达式的结果。

Kotlin 复制代码
fun main() {
    val bean = Bean("wk", 25)

    val result = bean.let {  // 返回最后一行
        it.name = "冰冰"
        51
    }
    println(result)    // 打印:51
    println(bean.name) // 冰冰
}

takeIf:

takeIf 函数将对象作为 lambda 表达式作为参数,如果 lambda 返回 true ,则返回原始对象false 则返回 null。它可以用于进行条件判断并选择性地操作对象。

Kotlin 复制代码
fun main() {
    val bean = Bean("wk", 25)

    val result = bean.takeIf {  // 最后一行是 true 正常返回对象, 反之返回 null
        it.name = "木木"
        true/false
    }
    println(result?.name) // 打印:木木/null
}

这些作用域函数在不同的情况下可以提供更简洁灵活的代码编写方式。我个人用的最多的是 apply 和 let

相关推荐
btown17 小时前
Kotlin 版 MyBatis-Plus 查询优雅解决方案
kotlin
小二·20 小时前
车载数字座舱实战:用魔珐星云打造下一代智能驾乘助手(附 Android/Kotlin 完整代码)
开发语言·kotlin
我命由我1234521 小时前
Android 开发问题:java.lang.NoSuchMethodError:No virtual method readAllBytes()
android·java·java-ee·kotlin·android studio·android-studio·android runtime
Kapaseker1 天前
你是不是还没用过 select?实战 Kotlin select
android·kotlin
plainGeekDev2 天前
synchronized → Coroutines
android·java·kotlin
唐青枫2 天前
Java Gradle 实战指南:从 Wrapper、Kotlin DSL 到 Spring Boot 多模块构建
java·kotlin·gradle
帅次3 天前
Kotlin Flow 与 StateFlow:UI 单向数据流基础
开发语言·ui·kotlin·stateflow·onlifecycle
Kapaseker3 天前
Sequence 一定比 List 快?等等,我们先从基础讲起
android·kotlin
zhangjin11204 天前
Android Studio创建HelloWorld(kotlin版本)
android·kotlin·android studio
怣疯knight4 天前
kotlin安卓应用打包编译卡死的可能原因
android·kotlin