使用 inline 声明的函数,在编译时将会拷贝到调用的地方。
###inline function
定义一个sum函数计算两个数的和。
fun main(args: Array) {
println(sum(1, 2))
}
fun sum(a: Int, b: Int): Int {
return a + b
}
反编译为 Java 代码:
public static final void main(@NotNull String[] args) {
int var1 = sum(1, 2);
System.out.println(var1);
}
public static final int sum(int a, int b) {
return a + b;
}
正常的样子,在该调用的地方调用函数。
然后为 sum 函数添加 inline 声明:
inline fun sum(a: Int, b: Int): Int {
return a + b
}
再反编译为 Java 代码:
public static final void main(@NotNull String[] args) {
//…
byte a i v = 1 ; i n t b iv = 1; int b iv=1;intbiv = 2;
int var4 = a i v + b iv + b iv+biv;
System.out.println(var4);
}
public static final int sum(int a, int b) {
return a + b;
}
sum 函数的实现代码被直接拷贝到了调用的地方。
上面两个使用实例并没有体现出 inline 的优势。当你的函数中有 lambda 形参时,inline 的优势才会体现。
###inline function with lambda parameters
考虑如下代码,会被编译成怎样的 Java 代码?
fun sum(a: Int, b: Int, lambda: (result: Int) -> Unit): Int {
val r = a + b
lambda.invoke®
return r
}
fun main(args: Array) {
sum(1, 2) { println(“Result is: $it”) }
}
反编译为 Java:
public static final int s