1. 定义
高阶函数就是参数类型包含函数类型,或者返回一个函数类型。高就函数就是函数里面套函数
1.1 参数类型包含函数类型
1.2 返回值为函数类型
1.3 常见的高阶函数
1.3.1 forEach
1.3.1.1 forEach函数定义
forEach迭代了集合,把集合中的每个元素拿出来,依次去执行某一个操作,element是集合中的元素。
inline fun IntArray.forEach(action: (Int) -> Unit): Unit {
for (element in this) action(element)
}
1.3.1.2 forEach函数的使用
fun main() {
// forEach调用方法一:
// 传引用 ::println 的函数类型是 (Int) -> Unit
intArray.forEach(::println)
intArray.forEach({println("Hello $it")})
// forEach的参数就只有一个 action: (Int) -> Unit
// 如果不是只有一个,是最后一个,也可以把{...} 从()中移到括号的右边
intArray.forEach(){println("Hello $it")}
// 因为()中没有参数,所以可以省略
// 只有一个lambda表达式作为参数可以省略小括号
intArray.forEach{println("Hello $it")}
// forEach调用方法二:
val e = floatArrayOf(1.0f, 1.1f, 1.2f)
e.forEach {
println(it) // println是函数forEach()的入参action (Int) -> Unit
}
}
1.3.2 map
迭代了一个集合,把集合中的每个元素都拿出来,但是map是把拿出来的元素转换成另一个元素,然后得到一个新的List<R>, map是一个类型到另一个类型的转换
// R : 返回值元素类型
// transform: 函数类型
// map: 接受的参数类型是transform--->函数参数作为参数
// (Int) -> R: 把元素类型Int类转换成R类型, R是泛型
// mapTo: 是另一个高阶函数
inline fun<R> IntArray.map(transform: (Int) -> R): List<R> {
return mapTo(ArrayList<R>(size), transform)
}
1.3.3 更多的高阶函数
// 计算函数执行的耗时时间
fun cost(block: () -> Unit) {
val start = System.currentTimeMillis()
block()
println(Systen.currentTimeMillis() - start)
}
// 返回类型为函数类型
fun fibnacci(): () -> Long {
val first = 0L
var second = 1L
return {
val next = first + second
var current = first
first = second
second = next
current
}
}
fun main() {
cost {
val fibonacciNext = fibonacci() // 这是cost的入参
for (i in 0..10) {
println(fibnacciNext())
}
}
}