Kotlin 内联函数,在Kotlin语法中,Lambda表达式都会被编译成一个匿名类。这样的话每次调用Lambda表达式时,就会创建出新的对象,造成额外的内存开销,导致程序效率降低,为了解决这个问题,Kotlin中提供了一个修饰符“inline”,被inline修饰的Lambda(函数)称为内联函数,使用内联函数可以降低程序的内存消耗。本章将针对Kotlin中的内联函数进行学习。
使用内联函数
在Kotlin中,被“inline”修饰符修饰的Lambda(函数)称为内联函数,使用内联函数可以降低程序的内存消耗,但内联函数要合理使用,不要内联一个复杂功能的函数,尤其在循环中。接下来让我们通过一个案例来学习内联函数,具体代码如下所示。
package com.coolcou.chapter06
import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReentrantLock
inline fun <T> check(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
} finally {
lock.unlock()
}
}
fun main(args: Array<String>) {
var l = ReentrantLock()
check(l, { print("酷客教程是个好教程") })//l 是一个Lock 对象
}
运行结果:
酷客教程是个好教程
在上述代码中,通过inline关键字指定check()函数就是一个内联函数。在调用内联函数时,编译器会对check(l,{print(”酷客教程是个好教程”)})这句代码优化,去掉方法名称以避免入栈出栈操作,直接执行方法体内的内容。具体代码如下:
lock.lock()
try {
return "酷客教程是个好教程"
} finally {
lock.unlock()
}
}
通过上述代码可以看出,内联函数实际上在运行期间会增加代码量,但对程序可读性不会造成影响,同时也提升了性能。
禁用内联函数
目前我们已经知道当使用内联函数时,参数也都会随之内联,此时便会出现一个问题,就是如果参数有Lambda表达式时,Lambda表达式便不是一个函数的对象,从而也就无法当作参数来传递。为了解决这个问题,可以使用noinline修饰符来修饰参数,禁止参数产生内联关系。
接下来我们通过一个案例来演示,具体代码如下所示。
package com.coolcou.chapter06
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表达式是非内联关系,可以当作参数使用。
酷客教程相关文章:
评论前必须登录!
注册