编程是一门艺术,程序员是艺术家,其他人是码农!
1.Kotlin的隐藏开销
伴生对象
伴生对象通过在类中使用companion object来创建,用来替代静态成员,类似于Java中的静态内部类。所以在伴生对象中声明常量是很常见的做法,但如果写法不对,可能就会产生额外开销。
2. For循环
Kotlin提供了downTo
、step
、until
、reversed
等函数来帮助开发者更简单的使用For循环,如果单一的使用这些函数确实是方便简洁又高效,但要是将其中两个结合呢?比如下面这样:
fun show(){
val i: Int = 10
for (a in 100 downTo 10 step 10)
println(i)
}
转换后的Java代码
public void show() {
int i = 10;
IntProgression var10000 = RangesKt.step(RangesKt.downTo(100, 10), 10);
int a = var10000.getFirst();
int var3 = var10000.getLast();
int var4 = var10000.getStep();
if (var4 > 0) {
if (a > var3) {
return;
}
} else if (a < var3) {
return;
}
while(true) {
System.out.println(i);
if (a == var3) {
return;
}
a += var4;
}
}
重点看这行代码:
IntProgression var10000 = RangesKt.step(RangesKt.downTo(10, 1), 2);
这行代码就创建了两个IntProgression临时对象,增加了额外的开销。
3.基本类型数组
在Kotlin中有3种数组类型:
IntArray
,FloatArray
,其他:基本类型数组,被编译成int[]
,float[]
,其他
Array<T>
:非空对象数组
Array<T?>
:可空对象数组
//kotlin 创建数组
val a =intArrayOf(1)
val b =arrayOf(1)
val c =arrayOf(null)
等价java创建数组
@NotNull
private final int [] a =int[]{1}
@NotNull
private final Integer [] b=new Integer[]{Integer.valueOf(1)}
@NotNull
private final Integer [] b=new Integer[]{(Integer)null}
后面两种方法都对基本类型做了装箱处理,产生了额外的开销。
所以当需要声明非空的基本类型数组时,应该使用xxxArray,避免自动装箱。
?.
、?:
list.get(1).account
println("-----------------------")
list.add(User().also { it.mobile = "1111111" })
//abc?.let abc不为空调用,为空跳过
list.get(3).account?.let {
println(it)
}
list.get(3).mobile?.let {
println(it)
}
//?: 前面不为空返回前面的值否则返回后面的值
UserVo(id = user.id ?: 0, account = user.account ?: "")
未完待续 - - -