1.3.1 inline
函数在运行时都会生成一个对象,很多的小函数意味着额外的开销,使用内联函数则会在编译时进行优化。[编译会在调用方生成代码]
inline fun <T> lock(lock: Lock, body: () -> T): T {...}
1.3.2 noinline
如果希望只内联一部分传给内联函数的 lambda 表达式参数,那么可以用 noinline 修饰符标记不希望内联的函数参数 [inline只能编译一层 不能边缘内部在调用]
inline fun foo(name: () -> Unit, noinline age: () -> Unit) { ……
1.3.3 局部返回 return & return@
一般情况下, 方法里面的lambda是不能return外部函数的.
举例: 这是个普通的高阶方法, 带有一个lambda参数:
fun fooNormal(body: () -> Unit) {
println("normal start")
body()
println("normal done")
}
它被调用的时候, 如果想在lambda中直接return:
fun main() {
fooNormal {
println("body 1")
return // return is not allowed here
return@fooNormal // return@fooNormal is allowed
}
1.3.4 reified
类型参数具体化(T)具体化关键字:reified,用于泛型形参上,且函数要以inline修饰,而该函数不必须是一个高阶函数(即不必须使用函数作为参数)
class SimpleClassTest {
private inline fun <reified T> anyObject(): T {
return Mockito.anyObject<T>()
}
}
1.3.5 crossinline
在内联函数中,可能没有直接调用lambda函数参数,而是通过一个局部对象中的函数,或其它函数来调用;这时在调用函数中可能包含非局部返回,这是不允许的,需要使用crossinline关键字,指明只能局部返回
如,
inline fun f(crossinline body: () -> Unit) {
val func = Runnable {
body()
}
//局部对象中调用
object {
fun funX() {
body()
}
}
// ...
}
调用f():
fun testF() {
f {
listOf(1).forEach(return@f)
// return@f
println("ajajaj")
}
}
Kotlin-内联inline、noinline、reified、crossinline
最新推荐文章于 2023-09-21 22:04:35 发布