1. 接收Lambda参数的函数就可以称为 具有函数式编程风格的API.
(一) 什么叫高阶函数?
1. 一个函数接收另一个函数作为参数, 或者返回值的类型是另一个函数. 那么该函数就称为高阶函数.
2. 函数类型: (String, Int) -> Unit
使用 fun example((String, Int) -> Unit) {}
(一) 什么叫内联函数?
方法前面加上关键字 inline , 就是内联函数
inline fun example((String, Int) -> Unit) {} 就是Kotlin 编译器会将内联函数中 的代码在编译的时候自动替换到调用它 的地方.
如果不是内联函数, 底层原理是被转换成了匿名类+接口的实现方式, 高阶函数每次都被会创建一个新的匿名类实例. 会造成额外的内存和性能的开销.
内联函数才能完全消除Lambda表达式所带来的运行时开销.
(三) noinline 非内联函数
既然内联函数这么好, 为什么Kotlin还要提供非内联函数. 内联函数有哪些限制:
1.内联的函数类型参数 在编译的时候会被进行代码替换, 因此它没有真正的参数属性, 而非内联的函数类型参数可以自由地传递给其他任何函数. 因为它是一个真实的参数.
2. 内联的函数类型参数只允许传递给另外一个内联函数.
内联函数中可以使用return关键字, 而非内联函数不允许直接使用return, 可以用return@函数名.
* 如果我们在高阶函数中创建了另一个Lambda或者匿名类的实现, 并且在这些实现中调用函数类型参数, 此时如果再将高阶函数声明成内联函数, 就会提示错误.
比如: inline fun runRunnable(block: ()->unit) {
val runnable = Runnable {
block()
}
runnable.run()
}
* 一般情况下, 我们会将高阶函数声明成内联函数.
inline fun printString(string: String, block: (String) -> unit) {
block(string)
}











网友评论