内联函数用关键字inline声明。内联函数的使用增强了高阶函数的性能。内联函数告诉编译器将参数和函数复制到调用站点。
虚函数或局部函数不能声明为内联。以下是一些内联函数中某些地方不支持的表达式和声明:
- 地方课程的声明
- 内部嵌套类的声明
- 函数表达式
- 局部功能声明
- 可选参数的默认值
fun main(args: Array<
String>
) {
inlineFunction({ println("calling inline functions")})
}inline fun inlineFunction(myFun: () ->
Unit ) {
myFun()
print("code inside inline function")
}
输出:
calling inline functions
code inside inline function
非本地控制流
从内联函数, 我们可以从lambda表达式本身返回。这也将导致退出调用内联函数的函数。在这种情况下, 函数文字可以包含非本地return语句。
fun main(args: Array<
String>
) {
inlineFunction({ println("calling inline functions")
return}, { println("next parameter in inline functions")})
}inline fun inlineFunction(myFun: () ->
Unit, nxtFun: () ->
Unit) {
myFun()
nxtFun()
print("code inside inline function")
}
输出:
calling inline functions
跨行注释
【Kotlin内联函数】为了防止从lambda表达式和内联函数本身返回, 我们可以将lambda表达式标记为crossinline。如果在该lambda表达式中找到了return语句, 则将引发编译器错误。
fun main(args: Array<
String>
) {
inlineFunction({ println("calling inline functions")
return // compile time error
}, { println("next parameter in inline functions")})
}inline fun inlineFunction(crossline myFun: () ->
Unit, nxtFun: () ->
Unit) {
myFun()
nxtFun()
print("code inside inline function")
}
Noinline编辑
在内联函数中, 当我们希望将在内联函数中传递的某些lambda作为内联时, 请使用noinline修饰符标记其他函数参数。这用于设置在调用中不内联的表达式。
fun main(args: Array<
String>
) {
inlineFunctionExample({println("calling inline functions")}, {println("next parameter in inline functions")} )println("this is main function closing")
}inline fun inlineFunctionExample(myFun: () ->
Unit, noinline nxtFun: () ->
Unit) {
myFun()
nxtFun()
println("code inside inline function")
}
输出:
calling inline functions
next parameter in inline functions
code inside inline function
this is main function closing
如果一个内联函数不包含任何noinline函数参数, 并且不包含任何类型化的参数, 则编译器将生成警告。
推荐阅读
- Kotlin Hello World应用程序
- Kotlin继承
- Kotlin if表达式
- Kotlin高阶功能
- 命令行中的Kotlin Hello World程序。
- Kotlin第一个程序打印HelloWorld
- Kotlin HashSet类
- Kotlin HashMap(hashMapOf())
- Kotlin HashMap类