乐趣区

关于android:Kotlin-高阶函数与内联函数

一、前言

<font face= 黑体 > 在 Kotlin 学习笔记之内置类型(2)中咱们曾经将 Kotlin 函数的 基本概念 根本用法 讲完了,明天咱们来讲 函数进阶

二、高阶函数

2.1、高阶函数概念

<font face= 黑体 > 高阶函数就是 参数类型蕴含函数类型 或者 返回值类型是函数类型 的函数,简略的说,高阶函数就是函数外面套函数,如下所示:

// 参数类型是函数类型
fun needsFunction(block: () -> Unit) {block()
}

// 返回值是函数类型
fun returnsFunction(): () -> Long {return {System.currentTimeMillis()}
}

2.2、常见的高阶函数

  1. <font face= 黑体 >forEach 函数:承受的参数是一个函数

    // Kotin 自带的 forEach 函数
    inline fun IntArray.forEach(action: (Int) -> Unit): Unit {for (element in this) action(element)
    }
  2. <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,有须要能够间接下载。

退出移动版