一、前言
<font face= 黑体>在 Kotlin 学习笔记之内置类型(2)中咱们曾经将 Kotlin 函数的基本概念和根本用法讲完了,明天咱们来讲函数进阶。
二、高阶函数
2.1、高阶函数概念
<font face= 黑体>高阶函数就是参数类型蕴含函数类型或者返回值类型是函数类型的函数,简略的说,高阶函数就是函数外面套函数,如下所示:
// 参数类型是函数类型fun needsFunction(block: () -> Unit) { block()}// 返回值是函数类型fun returnsFunction(): () -> Long { return {System.currentTimeMillis()}}
2.2、常见的高阶函数
<font face= 黑体>forEach 函数: 承受的参数是一个函数
// Kotin 自带的 forEach 函数inline fun IntArray.forEach(action: (Int) -> Unit): Unit { for (element in this) action(element)}
<font face= 黑体>map 函数: 承受的参数是一个函数
// Kotin 自带的 map 函数inline fun <R> IntArray.map(transform: (Int) -> R): List<R> { return mapTo(ArrayList<R>(size), transform)}
2.3、高阶函数的调用
<font face= 黑体>forEach 的调用:
val intArray = IntArray(5){ it + 1 }intArray.forEach(::println)// 括号() 外面其实能够把它当做一个参数,只是这个参数是函数intArray.forEach ({ println(it)})// () 能够省略,就变成了上面这样intArray.forEach { println(it)}
<font face= 黑体>forEach 承受的类型参数类型是 (Int) -> Unit,而 println 函数的类型有一个就是 (Int) -> Unit,所以能够用函数援用来接管。
三、内联函数
3.1、内联函数概念
<font face= 黑体>被 inline 标记的函数就是内联函数,其原理就是:在编译期间,把调用这个函数的中央用这个函数的办法体进行替换。咱们来看上面这个代码,就是一个 forEach 函数遍历数组:
val ints = intArrayOf(1, 2, 3, 4)ints.forEach { println("Hello $it")}
<font face= 黑体>forEach 函数的定义下面咱们曾经看到了,如下,能够看到,forEach 被 inline 润饰,所以它是个内联函数
inline fun IntArray.forEach(action: (Int) -> Unit): Unit { for (element in this) action(element)}
<font face= 黑体>其实 forEach 真正的实现是上面这个代码:
for (element in this) action(element)
<font face= 黑体>内联函数能够缩小函数的调用来优化性能。
3.2、内联函数的定义
<font face= 黑体>内联函数的定义很简略,就是在一个函数的后面加上 inline 关键字。
inline fun hello() { println("hello")}
<font face= 黑体>尽管说内联函数能够缩小函数的调用来优化性能,然而并不是每个函数前加一个 inline 就能够优化性能,其实咱们个别会把高阶函数定义为内联函数。
3.3、高阶函数与内联函数更配
cost { println("hello")}
inline fun cost(block: () -> Unit) { val start = System.currentTimeMillis() block() println(System.currentTimeMillis() - start)}
<font face= 黑体>比如说咱们要计算 println("hello") 这段代码执行的工夫,如果不加 inline 的话,那么调用 cost 就要创立 Lambda 表达式,函数调用,后果发现这些操作的工夫就要大于 println("hello") 这段代码执行的工夫,这样是齐全没有必要的,所以咱们加上 inline 之后,调用 println("hello"),实际上就等于上面这样:
val start = System.currentTimeMillis()println("hello")println(System.currentTimeMillis() - start)
<font face= 黑体>能够看到加上 inline 之后,cost 函数的调用开销没了,Lambda 表达式的创立开销也没了,这就是内联函数的作用。
3.4、内联函数的限度
- <font face= 黑体>public/protected 的内联办法只能拜访对应类的 public 成员;
- <font face= 黑体>内联函数外面的参数不能被存储(赋值给一个变量);
- <font face= 黑体>内联函数的参数只能传递给其余内联函数。
<font face= 黑体>其实内联函数最重要的是对高阶函数的性能优化。
四、小结
<font face= 黑体>本篇博客次要讲了 Kotlin 中的高阶函数和内联函数,下一节咱们讲 Kotin 的 汇合变换与聚合。
五、源码
源码 已上传至 github,有须要能够间接下载。