Kotlin-标准库函数apply
特点
- 持有
this
,函数内this
可省。- 返回值为
this
。- 该函数可以看做实例对象的配置函数。
定义
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
定义代码解释
-
fun <T, R> T.run(block: T.() -> Unit): T
是一个扩展函数,它扩展了任何类型T
。可以在任何T
类型的对象上调用这个函数,而不需要在T
类中显式定义它。这个函数的接收者(即被扩展的对象)在函数体内通过this
关键字访问。 -
合约(contract):是Kotlin 1.3及以后版本中引入的合约系统的一部分。合约允许开发者指定函数与其参数之间的行为约定,这有助于编译器进行更精确的优化和错误检查。
-
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
表示block
这个lambda表达式将在apply
函数体内恰好被调用一次。这有助于编译器理解block
的执行上下文,从而可能优化代码或提供更准确的错误检查。 -
block: T.() -> Unit
是一个函数类型(也称为lambda表达式或匿名函数)的声明,它具有特定的接收者类型和Unit
返回类型**。这个特定的声明方式表示这是一个扩展函数类型的lambda表达式,它扩展了T
类型的对象。T
:这是lambda表达式的接收者类型。在这个上下文中,T
是apply
扩展函数所应用的对象的类型。当apply
函数被调用时,它会将自身(即调用它的对象)作为隐式的this
传递给block
lambda表达式。() -> Unit
:这部分指定了lambda表达式的参数列表和返回类型。这里的空括号()
表示lambda表达式不接受任何参数(除了隐式的this接收者之外)。Unit
是lambda表达式的返回类型(Kotlin中用Unit
类型作为函数返回结果,使得Kotlin中的函数调用皆为表达式,它的实例只有一个,可写为()
)。T.()
:将这两部分组合起来,T.()
表示这是一个扩展函数类型的lambda表达式,它作用于T
类型的对象上。在lambda表达式内部,你可以直接访问和操作这个T
类型的对象,就像它是一个扩展函数或成员函数一样,尽管实际上它只是一个lambda表达式。
使用方法
bean.apply {
other.field1 = this.field1 // this可省
other.field2 = field2
}