天天看点

Kotlin inline & noinline & crossinlineinline & noinline & crossinline

文章目录

  • inline & noinline & crossinline
    • inline
      • 普通调用
      • inline调用
    • noinline
    • crossinline
      • 不使用crossinline
      • 使用crossinline

inline & noinline & crossinline

inline

  • Kotlin对函数进行内联的支持
  • inline可以让你使用内联,即将函数内容直插到调用处,优化代码结构,减少函数类型的对象的创建

普通调用

fun main() {
    hello {
        println("world")
    }
}

fun hello(block: () -> Unit) {
    println("hello")
    block()
}

//hello
//world
           

inline调用

fun main() {
    hello {
        println("world")
    }
}

inline fun hello(block: () -> Unit) {
    println("hello")
    block()
}

//hello
//world
           

编译后等价于

fun main() {
    println("hello")
    println("world")
}
           

noinline

  • noinline是局部关闭内联优化
fun main() {
    hello {
        println("world")
    }
}

inline fun hello(noinline block: () -> Unit) {
    println("hello")
    block()
}
           

编译后等价于

fun main() {
    println("hello")
    ({
        println("world")
    }).invoke()
}
           

crossinline

  • 局部加强内联优化
  • 被crossinline修饰的lambda参数,不能使用return

不使用crossinline

fun main() {
    println("1")
    hello {
        println("world")
        return
    }
    println("2")
}

inline fun hello(block: () -> Unit) {
    println("hello")
    block()
}

//1
//hello
//world
           

编译后等价于

fun main() {
    println("1")
    println("hello")
    println("world")
    return
    println("2")
}
           

使用crossinline

fun main() {
    println("1")
    hello {
        println("world")
    }
    println("2")
}

inline fun hello(crossinline block: () -> Unit) {
    println("hello")
    block()
}