1、什么是内联函数
使用inline关键字修饰的函数被称为内联函数,其作用是在编译阶段将函数体的代码直接嵌入到函数调用处,而不是通过函数调用的方式来执行,这样可减少函数调用带来的额外开销,如传递参数,创建和销毁栈帧等, 可以使代码更加简洁直观。
2、Kotlin中常见的内联函数
apply:该函数参数中lambda体持有当前调用者对象this,返回结果为本身即obj.适合链式调用场景。
使用方式:
obj.apply{//持有this
///lambda执行代码块
}.apply{
///lambda执行代码块
}...
run:该函数参数中lambda体持有当前调用者对象this,返回结果为lambda表达式执行返回的结果.
使用方式:
obj.run{//持有this
///lambda执行代码块,最后一行的返回值就是run函数的返回值
}
let:该函数的调用者作为函数体唯一参数,故参数中lambda体持有it,返回结果为lambda表达式执行返回的结果
使用方式:
obj.let{//持有it
//lambda执行代码块,最后一行的返回值为let函数的返回值
}
also:函数参数中的lambda体持有it,返回结果为当前调用对象,因此也适合链式调用。
使用方式:
obj.also{//持有it
///lambda执行代码块
}.also{//持有it
///lambda执行代码块
}
with:该函数的lambda体也是持有this,函数的返回结果为lambda表达式执行返回的结果,作用类似于run函数,只是调用方式不同
使用方式:
with(obj) {
//lambda执行代码块
}
3、手写内联函数
内联函数的实现实际上使kotlin高阶函数的一个运用场景,参数中都包含lambda表达式。所谓高阶函数就是函数的参数或者返回值类型为函数的函数。以下为上面五个内联的函数的手写实现,跟源码差不多。
手写apply
inline fun <T> T.myApply(lambda:T.()->Unit):T {
lambda()
return this
}
手写run
inline fun <T, R> T.myRun(lambda:T.()->R):R{
return lambda()
}
手写let
inline fun <T, R> T.myLet(lambda:(T)->R):R {
return lambda(this)
}
手写also
inline fun <T> T.myAlso(lambda:(T)->Unit):T{
lambda(this)
return this
}
手写with
inline fun <T, R> myWith(receiver:T, lambda:T.()->R):R {
return receiver.lambda()
}
注意:apply\run\let\also是对泛型函数的扩展,即任何类型的对象都可以直接调用,而with为一个普通的高阶函数,使用方式与其他四个不一样。