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,可以写出更简洁、专注的初始化代码,提升可读性和维护性

相关推荐
LCD液晶屏35 分钟前
京瓷液晶屏停产替代:杭州立煌科技工业 LCD 解决方案
android·科技
2501_932750262 小时前
Android 自定义 View 入门
android
事圆则缓5 小时前
Android 开启线程的几种方式:Thread、线程池、HandlerThread 与协程
android
半摆烂日常19 小时前
低代码平台API对接实践:接口鉴权与数据同步的完整实现
android·低代码·rxjava
事圆则缓19 小时前
volatile 使用场景全解析:它能保证什么,又解决不了什么
android
蒲公英内测分发20 小时前
智能投影仪参加海外展会,未上架的 Android 配套 App 怎么让客户限时试用?
android
ii_best20 小时前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
终端安全笔记20 小时前
安卓做 MDM 管控,先分清三种注册入口
android·安全·智能手机
乌萨达21 小时前
手机模拟器安卓怎么用?电脑安装应用、玩手游与账号同步指南
android·智能手机·电脑·雷电模拟器
美狐美颜SDK开放平台1 天前
Android与iOS直播APP美颜有什么区别?视频美颜SDK开发详解
android·ios·音视频·视频美颜sdk