定义:参数有函数类型或者返回值是函数类型的函数,都叫做高阶函数。
fun a(funParam: (Int) -> String): String {
return funParam(1)
}
要传一个函数类型的参数,或者把一个函数类型的对象赋值给变量有三种方法
fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
val result = operation(num1, num2)
return result
}
1.双冒号 ::method
在 Kotlin 里,一个函数名的左边加上双冒号,它就不表示这个函数本身了,而表示一个对象,或者说一个指向对象的引用,但,这个对象可不是函数本身,而是一个和这个函数具有相同功能的对象。
fun plus(num1: Int, num2: Int) : Int {
return num1 + num2
}
val a = num1AndNum2(10, 8, ::plus)
2. 匿名函数
val a = num1AndNum2(10, 8, fun(num1: Int, num2: Int) = num1 + num2)
3.Lambda 表达式(常用)
val a = num1AndNum2(10, 8) {
n1, n2 -> n1 + n2
}
内联函数inline
调用高阶函数num1AndNum2时,Lambda表达式变成了函数接口的匿名类实现,然后在invoke()函数中实现了n1+n2的逻辑并将结果返回。每次调用Lambda表达式都会创建一个新的匿名类实例,会造成额外的内存和开销。
Kotlin编译器会将内联函数中的代码在编译时自动替换到调用它的地方,这样就不存在运行时的开销了。一般会把高阶函数声明为内联函数。
inline fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
val result = operation(num1, num2)
return result
}
noline和crossinline
inline fun inlineFun(block1:() -> Unit, noline block2: () -> Unit) {
}
内联的函数参数类型只允许传递给另外一个内联函数,非内联的函数类型参数可以自由的传递给其他任何函数。内联函数和非内联函数的另一个区别就是Lambda表达式中可以使用return关键字进行函数返回,而非内联函数只能局部返回。
如果在内联高阶函数中创建了另外的Lambda或者匿名类的实现,并且在这些实现中调用函数的参数,就会提示错误。如
inline fun runRunnable(block: () -> Unit) {
val runnable = Runnable {
block() // 提示错误
}
}
因为Lambda表达式允许使用return返回函数,而高阶函数的匿名类实现中不允许使用return造成了冲突。crossinline用于保证内联函数Lambda表达式中一定不会使用return进行函数返回。
inline fun runRunnable(crossinline block: () -> Unit) {
val runnable = Runnable {
block()
}
}
声明后runRunnable函数的Lambda中无法使用return进行函数返回了,仍然可以使用return@runRunnable进行局部返回
reified 关键字
reified 配合 inline可以将泛型实例化
inline fun <reified T> startActivity(context: Context, block: Intent.() -> Unit) {
val intent = Intent(context, T::class.java)
intent.block()
context.startActivity(intent)
}
621

被折叠的 条评论
为什么被折叠?



