kotlin: 带接收者的函数类型
一,代码:
binding.button1.setOnClickListener {
//先定义一个Int类的扩展函数
fun Int.square() = this * this
//定义一个带接收器的lambda表达式
val squareFun: Int.()->Int = Int::square
val res1 = 5.square()
println("5.square() 的结果:"+res1)
val res2 = squareFun(5)
println("squareFun(5) 的结果:"+res2)
val res3 = 5.squareFun()
println("5.squareFun() 的结果:"+res3)
//直接定义带有接收器的lambda表达式
val squareFun2: Int.()->Int = { this * this }
val res4 = 5.squareFun2()
println("5.squareFun2() 的结果:"+res4)
//用匿名函数定义
val squareFun3: Int.()->Int = fun Int.() = this * this
//先定义匿名函数的变量
val sqFunc = fun Int.() = this * this
val squareFun4: Int.()->Int = sqFunc
val res5 = 5.squareFun3()
println("5.squareFun3() 的结果:"+res5)
val res6 = 5.squareFun4()
println("5.squareFun4() 的结果:"+res6)
// 定义一个带有接收器的lambda表达式
val printWithPrefix: String.(prefix: String) -> Unit = {
println("${it}:$this")
}
// 使用带有接收器的lambda表达式
val str = "床前明月光,粒粒皆辛苦"
str.printWithPrefix("消息") // 输出 Message: Hello
// 用泛型定义一个带有接收器的lambda表达式
fun <T, R> T.applyWith(receiver:R, block: T.(R) -> R): R {
return block(receiver)
}
//表达式放在括号外
val result1 = "Hello,".applyWith("world") {
this + it
}
println(result1) // 输出 Hello,World
//表达式放在括号内
val result2 = "Hello,".applyWith("world",{ this + it })
println(result2) // 输出 Hello,World
val result3 = 5.applyWith(3,{ this + it })
println(result3) // 输出 8
//定义一个数据类Person
data class Person(var name: String, var age: Int)
//增加一个年龄自增的方法
val ageIncre: Person.() -> Unit = {
println("年龄自增前:Name: $name, Age: $age")
age += 1
}
val person = Person("尼古拉斯赵四", 25)
// 在 Lambda 表达式中,可以直接访问 Person 类的成员
person.ageIncre()
// 输出: Name: 尼古拉斯赵四, Age: 26
println("年龄自增后:: ${person.age}")
}