Kotlin中新增加了函数类型,我们先来看它的相关规则 eg: (String, Int) -> Unit 左边声明函数接收什么参数,没有则为空括号,右边声明返回值类型,没有则使用Unit,与Java中void类似。 高阶函数:将函数类型添加到函数的参数声明或者返回值声明中。举个栗子:
fun num1AndNum2(num1 : Int, num2: Int, operation:(Int, Int)->Int):Int{ val result = operation(num1, num2) return result fun main(){ val n1 = 1 val n2 = 2 val result1 = num1AndNum2(n1, n2){n1, n2-> n1 + n2} val result2 = num1AndNum2(n1, n2){n1, n2-> n1 - n2} println("result1 is $result1") println("result2 is $result2")打印出来的结果显而易见,这里我们又用到了lambda表达式,通过其类型推导机制,可以使代码更简洁,如果用常规方法,则必须定义与其函数类型参数相匹配的函数,这样往往复杂且不必要。
实现原理: 函数类型参数转变成相关内置接口,而lambda表达式被转换成匿名类的实现。
❗特别注意:每调用一次lambda表达式,都会创建新的匿名类实例,从而造成额外的内存和性能开销。
内联函数: Kotlin编译器会将内联函数中的代码在编译的时候替换到其被调用的地方,从而完全消除运行开销。 关键字: inline (ps: 个人觉得与宏很类似
❗注意:①内联函数引用的lambda表达式可以用return关键字进行返回,而非内联函数则只能进行局部返回,即跳过当前函数外。 ②如果在高阶函数中创建了另外的lambda表达式或者匿名类的实现,并在其中调用函数类型参数,如果声明为内联函数,则会报错,此时 要用关键字crossline来保证不会使用return,解除匿名类与lambda表达式之间的矛盾!