Kotlin的内置函数之apply

Kotlin 的 apply 函数是一个实用的‌作用域函数 ‌,主要用于‌对象初始化配置 ‌或‌链式调用操作‌。以下是它的核心知识点和使用场景:

基本特性

  1. 函数签名‌:

    kotlin 复制代码
    fun <T> T.apply(block: T.() -> Unit): T {
    block() return this 
    }
    • T 的扩展函数,接收一个带接收者的 lambda(T.() -> Unit)。
    • 返回对象本身 ‌(即 this),允许链式调用。
    • 从语法上可知,apply 是一个泛型扩展函数。它接收一个 lambda 表达式作为参数,这个 lambda 表达式会在对象的上下文里执行。最终,apply 函数返回对象本身。
  2. 核心用途‌:

    • 在对象创建后,‌集中配置其属性或方法‌。
    • 替代冗长的重复变量名,简化代码。

使用示例

示例 1:对象初始化

kotlin 复制代码
class Person {
    var name: String = ""
    var age: Int = 0

    override fun toString(): String {
        return "Person(name='$name', age=$age)"
    }
}

fun main() {
    val person = Person().apply {
        name = "Alice"
        age = 30
    }
    println(person)
}

示例 2:Android View 配置

ini 复制代码
val textView = TextView(context).apply {
    text = "Hello"
    textSize = 16f
    setPadding(10, 0, 10, 0)
}

示例 3:链式操作

kotlin 复制代码
fun main(){
    val info = "LiLei You Hao"
    // 普通的方式
    println("info字符串的长度是:${info.length}")
    println("info最后一个字符是:${info[info.length -1]}")
    println("info全部转成小写是:${info.toLowerCase()}")
    println()
    //applay 方式

    // apply内置函数的方式
    // info.apply特点:apply函数始终是返回 info本身 String类型
    val infoNew = info.apply {
        println("info字符串的长度是:${length}")
        println("info最后一个字符是:${this[length -1]}")
        println(info.apply { "info全部转成小写是:${toLowerCase()}" })
    }

    println("inforNew:$infoNew")

    //开发中常用链式调用
    info.apply {
        println("info字符串的长度是:${length}")
        true
        true
        false
    }.apply {
        println("info最后一个字符是:${this[length -1]}")
    }.apply {
        println(info.apply { "info全部转成小写是:${toLowerCase()}" })
    }


}

与其他作用域函数的区别

函数 参数形式 返回值 典型使用场景
apply T.() -> Unit T 对象配置
also (T) -> Unit T 对象操作(需显式 it 引用)
run T.() -> R R 对象转换或计算值
let (T) -> R R 非空检查或对象转换

关键注意事项

  1. ‌**this 可省略**‌:在 apply 的 lambda 中,this 是接收者对象,可直接访问其成员。
  2. 返回自身‌:适合在链式调用中多次配置对象。
  3. 与构造函数互补‌:用于构造后无法在初始化块中完成的配置(如不可变属性)。
  4. 内联优化‌:作为内联函数,无额外性能开销。

适用场景

  • 密集配置对象属性‌(如 UI 组件、DTO 对象)。
  • 链式调用‌多个方法或属性。
  • 替代 Builder 模式‌,简化代码结构。

通过 apply,可以写出更简洁、专注的初始化代码,提升可读性和维护性

相关推荐
踢球的打工仔21 小时前
PHP面向对象(7)
android·开发语言·php
安卓理事人21 小时前
安卓socket
android
安卓理事人1 天前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学1 天前
Android M3U8视频播放器
android·音视频
q***57741 天前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober1 天前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿1 天前
关于ObjectAnimator
android
zhangphil1 天前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我1 天前
从头写一个自己的app
android·前端·flutter
lichong9511 天前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端