Kotlin 几点理解

Kotlin 几点理解

网上那些一搜一大把的东西我就不写了,直接写我最近想到的问题吧

1 成员变量

class Test2(var a: Int) {
    val b = a
    val c = 3

    init {
        println(b)
    }
}

编译后为


public final class Test2 {
   private final int b;
   private final int c;
   private int a;

   public final int getB() {
      return this.b;
   }

   public final int getC() {
      return this.c;
   }

   public final int getA() {
      return this.a;
   }

   public final void setA(int var1) {
      this.a = var1;
   }

   public Test2(int a) {
      this.a = a;
      this.b = this.a;
      this.c = 3;
      int var2 = this.b;
      System.out.println(var2);
   }
}

由上可以看出,成员变量的初始化,全部是放在构造函数中进行的,也就是意味着,我们通过构造函数传过来的参数,可以直接给变量赋值
就像上面的成员变量b=a一样
当然这种方式只适用于默认构造函数

2 inlin函数

我们先来看一下inlin编译后的样子

class Test2() {
    init {
        add(1)
    }

    inline fun add(a: Int): Int {
        return a + 1
    }
}

使用inlin修饰编译后的样子


public final class Test2 {
   public final int add(int a) {
      int var10000 = a + 2;
      var10000 = a + 3;
      return a + 1;
   }

   public Test2() {
      int a$iv = 1;
      int var10000 = a$iv + 2;
      var10000 = a$iv + 3;
      int var1 = a$iv + 1;
   }
}


不使用inlin


public final class Test2 {
   public final int add(int a) {
      int var10000 = a + 2;
      var10000 = a + 3;
      return a + 1;
   }

   public Test2() {
      int var1 = this.add(1);
   }
}

在函数的编译上,没有区别,但是调用上,一个是直接执行inlin函数里面的代码,一个是调用函数

inlin函数相当于把代码写入到了调用的地方,而非inlin函数才会去调用函数

调用函数会牵扯到函数的入栈和出栈,相当于多用了一部分栈的操作,具体可以百度/谷歌,而inlin函数会增加代码量,提高效率,究竟怎么取舍,我也没有什么骚操作…各位自己看着办吧…

3 扩展函数

我们知道,用java写,扩展函数??,工具类,好吧…但是kotlin可以这么写


inline fun <T, reified R> List<T>.toArray(conver: (T) -> R): Array<R> {
    return Array(size, { conver(get(it)) })
}

然后配上泛型,是不是特别酷

list.toArray(){
    it.name
}

这样,就把一个list转换为了name字段的array

但是要注意,Kotlin真的是百分百能和java互相调用么???并不是,至少reified不可以

我们还可以给某些对象扩展函数,避免一些东西,比如下面这货

@Suppress("DEPRECATION")
@ColorInt
fun Resources.getColorCompat(@ColorRes id: Int): Int {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getColor(id, null)
    } else {
        getColor(id)
    }
}

这样,我们就可以直接调用了

context.resources.getColorCompat(id)

4 高阶函数

fun add(body:()->Unit){
        body()
}

kotlin最终是要编译成java.class的,那么在java中,函数,是可以别传递的么???不可以啊,那么kotlin中高阶函数是什么呢??

java中能被传递的只有 基本类型变量和对象,那么高阶函数是不是被编译器封装成了一个对象呢?我们看一下编译成的java文件


public final class Test2 {
   public final void add(@NotNull Function0 body) {
      Intrinsics.checkParameterIsNotNull(body, "body");
      body.invoke();
   }
}

我看到了什么??Function0??纳尼??好吧,点进去看看

package kotlin.jvm.functions

/** A function that takes 0 arguments. */
public interface Function0<out R> : Function<R> {
    /** Invokes the function. */
    public operator fun invoke(): R
}

看懂了么,先不在意outoperator 直接就看成这个样子

public interface Function0<R> : Function<R> {
    public fun invoke(): R
}

看懂了么,这就是一个对象啊,所有的高阶函数都被封装成了对象,调用的时候body.invoke()执行函数

kotlin.jvm.functions这个里面,有很多这样的函数,都是用于转换高阶函数的

想想我们一般定义Callback的方式,接口,一个/几个方法,相当于这部分工作让系统给我们做了,我们只需要写高阶函数即可

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值