Kotlin 内联函数

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表达式是非内联关系,可以当作参数使用。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!