Kotlin中Int和 Int? 以及 IntArray 和 Array的问题

开篇

之前文章中提到过,kotlin 的形参如果不加? 那么会默认为不为空。
这个小知识点在 kotlin 编译的时候其实很有用的,我们拿 java 中的 int和 Integer 来举例。
Integerint的包装类型,比 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) {
      //.....
   }
}
复制代码

大家仔细看形参的签名

  • myListint... inner
  • myList2Integer ...inner2
    大家可以思考kotlin编译器为何如此编译了?
    其实根本的原因就是?, 即可为空。
    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[],所以其中的参数不可为null
  • arrayOf类似 java 中的Integer[],所以可以在其中赋值null
  • kotlin中数组不能直接赋值给可变形参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);
}
复制代码

上述的思路其实都是一致的,代码最优。

Kotlin 空字符串 null or empty 的判断

Error 的地方连编译都通不过

举例:

val grantResults: IntArray? = null
println("${grantResults?.size}  ${grantResults?.isEmpty()}")
 
输出:
null  null
复制代码
var s: String? = ""
var str: String = s ?: "bb"
println("str:$str")
println("str:${s?.length ?: "bb"}")
 
输出:
str:
str:0
复制代码
var s: String? = null
var str: String = s ?: "bb"
println("str:$str")
println("str:${s?.length ?: "bb"}")
 
输出:
str:bb
str:bb
复制代码
var s: String? = ""
var str: String = if (s.isNullOrEmpty()) "bb" else s
println("str:$str")
println("str:${s?.length ?: "bb"}")
 
输出:
str:bb
str:0
复制代码
var s: String? = null
var str: String = if (s.isNullOrEmpty()) "bb" else s
println("str:$str")
println("str:${s?.length ?: "bb"}")
 
输出:
str:bb
str:bb
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享