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
}
看懂了么,先不在意out
和operator
直接就看成这个样子
public interface Function0<R> : Function<R> {
public fun invoke(): R
}
看懂了么,这就是一个对象啊,所有的高阶函数都被封装成了对象,调用的时候body.invoke()
执行函数
在kotlin.jvm.functions
这个里面,有很多这样的函数,都是用于转换高阶函数的
想想我们一般定义Callback的方式,接口,一个/几个方法,相当于这部分工作让系统给我们做了,我们只需要写高阶函数即可