天天看點

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()
}