一,代码:
// 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}")
}
二,测试效果:
![]()