定义高阶函数
- 想定义自己的函数式API,那就得借助高阶函数来实现
- 定义:如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数。
- 定义函数类型:(String, Int)-> Unit,在函数类型钱加上ClassName表示这个函数类型是定义在哪个类当中的
- 作用:高阶函数允许让函数类型的参数来决定函数的执行逻辑
- Lambda表示式是常见的高阶函数的调用方式
内联函数
- 高阶函数的实现原理:Lambda表达式在底层被转换成了匿名类的实现方式,每调用一次Lambda表达式都会创建一个新的匿名类实例,造成额外的内存和性能开销
- 内联函数可以将Lambda表达式带来的运行时开销完全消除
- 内联函数的使用:在定义高阶函数时,加上inline关键字即可
- 内联函数的转换过程:
- 将Lambda表达式中的代码替换到函数类型参数调用的地方
- 再将内联函数中的全部代码替换到函数调用的地方
- 如果一个高阶函数接收了两个或者更多函数类型的参数,并给函数添加了inline关键字,编译器将自动将所有的Lambda表达式进行内联,可以使用noinline关键词使某一个函数不被内联
- 内联函数在编译时会进行代码替换,因此它没有真正的参数属性,非内敛的函数类型参数可以自由地传递给其他任何函数,因为它就是一个真实的参数,而内联函数类型只允许传递给另外一个内联函数
- 内联函数和非内联函数还有一个重要的区别,就是内联函数引用的Lambda表达式时可以使用return进行返回的,而非内联函数只能进行局部返回
- 在高阶函数中创建了另外的Lambda表达式或者匿名类的实现,并且在这些实现中调用了函数类型参数,此时将高阶函数声明为内联函数就一定会提示错误,因为内联函数中的函数类型可以直接return返回,而在匿名类中又不能直接返回,造成了冲突
- crossinline:用于保证在内联函数的Lambda表达式中一定不会使用return关键字