
之前文章中提到过,kotlin 的形参如果不加?那么会默认为不为空。
这个小知识点在 kotlin 编译的时候其实很有用的,我们拿java中的 int和 Integer 来举例。
Integer是int的包装类型,比 int更浪费资源,最为一个优秀的 coder,肯定希望在范围允许内使用int而不是Integer。
我们来看看2个方法
fun myList(vararg inner: Int) {
println(inner.size)
}
fun myList2(vararg inner2: Int?) {
println(inner2.size)
}
上述2个方法的区别其实只在于 Int后面有没有?号。
我们要不先看看反编译的代码中重要的部分
public final class VarargThinkKt {
public static final void myList(@NotNull int... inner) {
//.....
}
public static final void myList2(@NotNull Integer... inner2) {
//.....
}
}
大家仔细看形参的签名
myList是int... innermyList2是Integer ...inner2kotlin编译器为何如此编译了??,即可为空。kotlin编译器认为形参不可为空的时候,完全可以用非包装的类型来接受参数,更合理的利用资源。我们通过例子来看看如何使用的问题
fun myList(vararg inner: Int) {
println(inner.size)
}
fun myList2(vararg inner2: Int?) {
println(inner2.size)
}
fun main() {
val intArrayOf = intArrayOf(1, 3, 4)
//注意这里的 null
val array = arrayOf(1, 3, 4, null)
myList(*intArrayOf)
myList(1, 2, 3)
myList2(*array)
myList2(1, 2, 3)
}
上述代码需要注意的是:
Int类型的数组,kotin提供了2个方法,一个是intArrayOf(),一个是arrayOf();intArrayOf强调的是int,类似 java中的int[],所以其中的参数不可为nullarrayOf类似 java 中的Integer[],所以可以在其中赋值nullkotlin中数组不能直接赋值给可变形参vararg,需要通过关键字*array的时候,如果不需要 null,是不是用intArray更优秀了?有 intArrayOf,那么也应该有longArrayOf啦
同时Java8的 Stream下也有类似的设计,我们看看这个东西
@FunctionalInterface
public interface IntConsumer {
void accept(int value);
}
@FunctionalInterface
public interface IntFunction<R> {
R apply(int value);
}
上述的思路其实都是一致的,代码最优。
学习新知识的同时,同旧有知识结合起来理解,也是一个不错的学习方式。