kotlin: 函数类型的定义

一,代码:

// 1 . 声明函数类型,需放在顶层,不能在类和方法中
typealias mathAdd = (Int, Int) -> Int

...

        //处理按钮点击事件
        binding.button1.setOnClickListener {

            // 2 . 为预定义函数类型实例化
            var add : mathAdd = {a : Int, b : Int -> a + b}

            // 3 . 为函数类型实例化: 将 Lambda 表达式赋值给函数类型变量
            var add2 : (Int, Int) -> Int = {a : Int, b : Int -> a + b}

            // 将 匿名函数 赋值给函数类型变量
            var add3 : (Int, Int) -> Int = fun (a : Int, b : Int) : Int {return a + b}

            //定义一个函数
            fun addFunc(a : Int, b : Int) : Int {
                return a + b
            }

            // 将顶层的 addFunc 函数赋值给 add3 函数类型变量 :: 用于获取顶层定义的函数
            //  如果获取 类中定义的函数 , 可以使用 类名::函数名 获取
            var add4 : (Int, Int) -> Int = ::addFunc

            // 将已经定义好的函数类型变量重新赋值给 另外一个函数类型明亮
            var add5 : (Int, Int) -> Int = add2

            //函数类型 派生类
            //函数类型可以看做一个接口 , 类可以实现该接口 ,
            // 在实现类中实现具体的函数操作 ,
            // 该 函数类型接口的实现类 , 可以赋值给函数类型变量 ;
            class AddOperation : (Int, Int) -> Int{
                override fun invoke(p1: Int, p2: Int): Int {
                    return p1 + p2
                }
            }

            // 将 函数类型 接口派生类对象赋值给 函数类型变量
            var add6 : (Int, Int) -> Int = AddOperation()

            //带接收者的函数类型 , 可以转换为 不带接收者的函数类型 ,
            // 转换规则是 , 带接收者的函数类型的接收者 , 可以转换为不带接收者类型的第一个参数

            // 字符串 "abc" 调用该函数 , 传入 2 参数 , 结果是 "abcabc"
            var fun1 : String.( Int ) -> String = {times : Int -> this.repeat(times)}

            // 这是将 接收者 设置成了第一个参数 , 将 String.( Int ) -> String 函数类型的变量 fun1 赋值给了
            //  ( String, Int ) -> String 函数类型变量
            var fun2 : ( String, Int ) -> String = fun1


            //--------------------------- 调用函数 ---------------------------
            // 调用add
            var result = add(1,2)
            println("add的结果:$result")

            // 调用add2
            var result2 = add2(1,2)
            println("add2的结果:$result2")

            // 调用add3
            var result3 = add3(1,2)
            println("add3的结果:$result3")

            // 调用add4
            var result4 = add4(1,2)
            println("add4的结果:$result4")

            // 调用add5
            var result5 = add5(1,2)
            println("add5的结果:$result5")

            // 调用add4
            var result6 = add6(1,2)
            println("add6的结果:$result6")

            //"Tom".fun1(2) = TomTom
            val resFun1 = "Tom".fun1(2)
            println("\"Tom\".fun1(2)运行结果: ${resFun1}")

            //fun2("Jerry", 2) = JerryJerry
            val resFun2 = fun2("Jerry", 2)
            println("fun2(\"Jerry\", 2)运行结果: ${resFun2}")

        }

二,测试效果:

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