一、前言
<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,有须要能够间接下载。