开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
Kotlin 内联函数,在Kotlin中,Lambda表达式会被编译成一个匿名内部类。相当于每次调用Lambda表达式,就会创建新的对象,会造成额外的内存开销,从而会影响程序的性能,为解决这系列问题,Kotlin中提供修饰符inline,被 inline 修饰的函数 称为内联函数,使用内联函数可以降低内存消耗。
使用内联函数
在Kotlin中,被“inline”修饰符修饰的Lambda(函数)称为内联函数,使用内联函数可以降低程序的内存消耗,但内联函数要合理使用,不要内联一个复杂功能的函数,尤其在循环中。接下来让我们通过一个案例来学习内联函数,具体代码如下所示。
inline fun <T> check(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
} finally {
lock.unlock()
}
}
在上述代码中,通过inline关键字修饰的check()函数就是一个内联函数。在调用内联函数时,编译器会对check(l,{print(”好教程”)}) 这句代码优化,去掉方法名称以避免入栈出栈操作,直接执行方法体内的内容。具体代码如下:
lock.lock()
try {
return "好教程"
} finally {
lock.unlock()
}
}
通过上述代码可以看出,内联函数实际上在运行期间会增加代码量,但对程序可读性不会造成影响,同时也提升了性能。
禁用内联函数
已经知道当使用内联函数时,参数也都会随之内联,此时便会出现一个问题,就是如果参数有Lambda表达式时,Lambda表达式便不是一个函数的对象,从而也就无法当作参数来传递。为了解决这个问题,可以使用noinline修饰符来修饰参数,禁止参数产生内联关系。
接下来我们通过一个案例来演示,具体代码如下所示。
inline fun check(noinline function: (Int) -> Boolean){
test(function)
}
fun test(function: (Int) -> Boolean){
println("教程")
}
fun main(args: Array<String>) {
check { x : Int -> x == 2 }
}
从运行结果可以看出,通过noinline修饰的Lambda表达式是非内联关系,可以当作参数使用。
在掘金(JUEJIN) 一起进步!