kotlin 高阶函数

2020-11-10  本文已影响0人  Sarah_love

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)

}

上一篇 下一篇

猜你喜欢

热点阅读