文章目錄
- 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()
}