Kotlin 的 apply
函数是一个实用的作用域函数 ,主要用于对象初始化配置 或链式调用操作。以下是它的核心知识点和使用场景:
基本特性
-
函数签名:
kotlinfun <T> T.apply(block: T.() -> Unit): T { block() return this }
- 是
T
的扩展函数,接收一个带接收者的 lambda(T.() -> Unit
)。 - 返回对象本身 (即
this
),允许链式调用。 - 从语法上可知,
apply
是一个泛型扩展函数。它接收一个 lambda 表达式作为参数,这个 lambda 表达式会在对象的上下文里执行。最终,apply
函数返回对象本身。
- 是
-
核心用途:
- 在对象创建后,集中配置其属性或方法。
- 替代冗长的重复变量名,简化代码。
使用示例
示例 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 |
非空检查或对象转换 |
关键注意事项
- **
this
可省略**:在apply
的 lambda 中,this
是接收者对象,可直接访问其成员。 - 返回自身:适合在链式调用中多次配置对象。
- 与构造函数互补:用于构造后无法在初始化块中完成的配置(如不可变属性)。
- 内联优化:作为内联函数,无额外性能开销。
适用场景
- 密集配置对象属性(如 UI 组件、DTO 对象)。
- 链式调用多个方法或属性。
- 替代 Builder 模式,简化代码结构。
通过 apply
,可以写出更简洁、专注的初始化代码,提升可读性和维护性