内联函数
内联函数通过与高阶函数配合,实现代码优化
inline fun action(run: () -> Unit) {
println("Hello")
run()
println("World")
}
fun main() {
action {
println("Kotlin")
}
println("Hello")
println("Kotlin")
println("World")
}
内联高阶函数的 return
fun main() {
val ints: IntArray = intArrayOf(1, 2, 3, 4)
ints.forEach {index ->
if (index == 3) {
return@forEach
}
println("main $index")
}
}
non-local return
inline fun nonLocalReturn(act:()->Unit){
act.invoke()
}
fun main() {
nonLocalReturn {
return
}
}
crossinline 禁止外部返回
inline fun nonLocalReturn(crossinline act:()->Unit){
act.invoke()
}
fun main() {
nonLocalReturn {
}
}
内联函数的限制
- public/protected 的内联方法只能访问对应类的 public 成员
- 内联函数的内联函数参数不能被存储(赋值给变量)
- 内联函数的内联函数参数只能传递给其他内联函数
inline/noinline/crossinline 总结
inline fun action(run: () -> Unit) {
println("Hello")
run()
println("World")
}
inline fun action2(run: () -> Unit, noinline run2: () -> Unit): () -> Unit {
run()
return run2
}
fun func(run: () -> Unit) {
run()
}
inline fun action3(crossinline run: () -> Unit) {
func {
run()
}
}
fun main() {
action {
println("Kotlin")
return@action
}
action {
println("Kotlin")
return
}
action3 {
println("Kotlin")
return@action3
}
action {
println("Kotlin")
}
println("Hello")
println("Kotlin")
println("World")
}