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}")

        }

 

二,运行结果:

posted @ 2025-07-26 11:36  刘宏缔的架构森林  阅读(30)  评论(0)    收藏  举报