内联函数通常用来优化高阶函数(以函数作为参数的函数)的性能,尤其是在lambda表达式和匿名函数频繁使用的情况下。
fun foo(body:()->Unit) {
ordinaryFunction {
// 因为标识为 inline 的函数会被插入到调用处,此时 return 肯定是 return 到该整个方法
println("zc_testlabama 表达式退出")
return
}
println("zc_test --->foo() end")
}
// 如果不使用 inline, 上面代码会被报错。因为「不允许这么做」
inline fun ordinaryFunction(block: () -> Unit) {
println("hahha")
block.invoke()
println("hahha233333")
}
inline fun foo(testName:String, body:()->Unit) {
// 这里会报错。。。
ordinaryFunction(body)
println("zc_test --->foo() end")
}
fun ordinaryFunction(block: () -> Unit) {
println("hahha")
block.invoke()
println("hahha233333")
}
//改为
inline fun foo(testName:String, noinline body:()->Unit) {
...
}
内联函数在高阶函数中特别有用。例如,使用高阶函数来处理一些操作时,可以避免lambda表达式的性能开销。
inline fun performOperation(operation: () -> Unit) {
println("Operation starting")
operation()
println("Operation completed")
}
fun main() {
performOperation {
println("Performing the operation")
}
}
在某些情况下,你可能不希望所有的参数都被内联。这时可以使用 noinline
修饰符。
inline fun inlineFunction(inlineBlock: () -> Unit, noinline noInlineBlock: () -> Unit) {
println("Before inline block")
inlineBlock()
println("After inline block")
println("Before noinline block")
noInlineBlock()
println("After noinline block")
}
只有 inlineBlock
会被内联,noInlineBlock
不会被内联。
码字不易,求转发,求点在看,求关注,感谢!