Kotlin 中的 带接收者的函数类型
kotlinintent.block()// 在 intent 对象上执行 lambda。
·
block: Intent.() -> Unit
是Kotlin 中的 带接收者的函数类型(Function Types with Receiver)
语法分解
kotlin
block: Intent.() -> Unit
-
block- 参数名称 -
Intent.()- 接收者类型(Receiver Type) -
Unit- 返回值类型(无返回值)
含义解释
这表示 block 是一个 在 Intent 对象上下文中执行的 lambda 函数。
使用示例
1. 函数定义
kotlin
fun startActivity(context: Context, block: Intent.() -> Unit) {
val intent = Intent(context, TargetActivity::class.java)
intent.block() // 在 intent 对象上执行 lambda
context.startActivity(intent)
}
2. 函数调用
kotlin
// 在 lambda 内部,this 指向 Intent 对象
startActivity(context) {
putExtra("key1", "value1") // 相当于 this.putExtra()
putExtra("key2", 123) // 可以直接调用 Intent 的方法
action = "CUSTOM_ACTION" // 可以直接访问 Intent 的属性
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
等价写法对比
传统写法(不带接收者)
kotlin
fun startActivity(context: Context, block: (Intent) -> Unit) {
val intent = Intent(context, TargetActivity::class.java)
block(intent) // 需要显式传递 intent 参数
context.startActivity(intent)
}
// 调用时
startActivity(context) { intent ->
intent.putExtra("key1", "value1")
intent.putExtra("key2", 123)
intent.action = "CUSTOM_ACTION"
}
带接收者的写法
kotlin
fun startActivity(context: Context, block: Intent.() -> Unit) {
val intent = Intent(context, TargetActivity::class.java)
intent.block() // 在 intent 的上下文中执行
context.startActivity(intent)
}
// 调用时 - 更简洁,更像 DSL
startActivity(context) {
putExtra("key1", "value1") // 省略了 intent. 前缀
putExtra("key2", 123)
action = "CUSTOM_ACTION"
}
优势
-
更简洁的语法 - 省略了重复的接收者对象名称
-
更好的可读性 - 代码更像领域特定语言(DSL)
-
类型安全 - 在 lambda 内部只能访问 Intent 的公共方法和属性
实际应用场景
这种模式在 Android 开发中很常见:
kotlin
// AlertDialog
AlertDialog.Builder(this).apply {
setTitle("标题")
setMessage("消息")
setPositiveButton("确定") { dialog, which -> }
setNegativeButton("取消") { dialog, which -> }
}.show()
// 使用带接收者的函数可以更简洁
fun createDialog(block: AlertDialog.Builder.() -> Unit): AlertDialog {
return AlertDialog.Builder(this).apply(block).create()
}
createDialog {
title = "标题"
message = "消息"
setPositiveButton("确定") { _, _ -> }
setNegativeButton("取消") { _, _ -> }
}更多推荐


所有评论(0)