Kotlin-5-高阶函数+Unit+Inline

☆樱花仙子☆ 提交于 2019-12-22 20:08:44

目录

1、定义:

2、Unit的定义

3、高阶函数的实现:

4、inline关键字

5、如何在AndroidStudio中查看kotlin编译后的class源码


1、定义:

高阶函数是指: 函数(Lambda)的参数是函数(Lambda)

2、Unit的定义

/**
 * Unit的定义:在kotlin中当一个函数没有返回值的时候,默认返回一个Unit类型。
 *                      我们大部分情况是可以省略这个Unit的,但是当参数是一个没有
 *                      返回值的Lambda匿名函数的话,就需要声明出来
 */

3、高阶函数的实现:

下面的gaoFun()函数的参数除了一个布尔类型的isSay以外,还有一个lambda函数作为了参数。这种函数我们就称之为高阶函数。

fun gaoFun(isSay: Boolean, lambda: () -> Unit) {
    if (isSay) {
        println("高阶函数的参数lambda()匿名函数传了进来")

        lambda()
    }
}

//main()函数的Unit就是省略的。(这里我特意加上了)
fun main(): Unit {

    //这里我们将lambda匿名函数传给了gaoFun
    gaoFun(false, { println("我是高阶函数") })

    //因为gaoFun函数的最后一个参数是Lambda,所以我们可以将lambda匿名函数放在小括号的后面
    gaoFun(true) { println("我也可以放在这里") }

    
    /**
     * 这里我声明了一个Runnable匿名内部类,然后将匿名内部类的run匿名函数赋值给了lambda
     */
    val runnable = Runnable {
        println("我是一个Runnable,我在被copy的时候就会运行")
    }

    val lambda: () -> Unit

    lambda = runnable::run

    gaoFun(true, lambda)

}

4、inline关键字

这个关键字用于函数声明,表示这个函数的内联的,它的作用就是编译器在编译时会对这种函数进行优化,从而减少函数对象的声明,减少空间的浪费。

  • 注意:过多的使用inline关键字会对编译器造成很大的性能压力,所以我们建议只在高阶函数中使用inline关键字

那么,inline如何优化高阶函数呢,如下:

4.1 未编译前的代码

//没有inline关键字修饰的函数
fun gaoFun1(isSay: Boolean, lambda: () -> Unit) {
    if (isSay) {
        lambda()
    }
}
//有inline关键字修饰的函数
inline fun gaoFun2(isSay: Boolean, lambda: () -> Unit) {
    if (isSay) {
        lambda()
    }
}

fun main() {
    gaoFun1(true) { println("lambda运行输出") }
    gaoFun2(true) { println("inline关键字函数") }
}

4.2、编译后的代码

可以很明显的看到,没有inline关键字修饰的gaoFun1()在main函数是直接被调用的,但是被inline修饰的gaoFun2()函数被直接抛弃,直接将它的逻辑移到了main函数中运行。从而减少调用函数带来的一些消耗。

public final class TestMain1Kt {
   public static final void gaoFun1(boolean isSay, @NotNull Function0 lambda) {
      Intrinsics.checkParameterIsNotNull(lambda, "lambda");
      if (isSay) {
         lambda.invoke();
      }

   }

   public static final void gaoFun2(boolean isSay, @NotNull Function0 lambda) {
      int $i$f$gaoFun2 = 0;
      Intrinsics.checkParameterIsNotNull(lambda, "lambda");
      if (isSay) {
         lambda.invoke();
      }

   }

   public static final void main() {
      gaoFun1(true, (Function0)null.INSTANCE);
      boolean isSay$iv = true;
      int $i$f$gaoFun2 = false;
      int var2 = false;
      String var3 = "inline关键字函数";
      boolean var4 = false;
      System.out.println(var3);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}

5、如何在AndroidStudio中查看kotlin编译后的class源码

第一步:选择你要查看你的kotlin文件,然后点击Tools-->Kotlin-->Show Kotlin Bytecode

第二步:点击左上角的 Decompile 按钮就会弹出你想要的class源码

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!