Kotlin 中可空性探究

115 阅读1分钟

Kotlin语言的可空性

  • 默认是不可空,即不能赋值为null

     var name = "value"
     name = null//报错
    
  • 将变量赋值为null:声明为可空类型

     var name1:String ? = "value"
     println(name1) --> value
     name1 = null
     println(name1) --> null
    

Kotlin 中可空类型的安全调用方法

  • 空安全操作符 ?

    • 格式:变量 ?. 业务代码

    • 逻辑:当变量为空时,业务代码不执行

    • 代码:

       fun main(){
       ​
           var name : String ?= "value"
           println(name?.capitalize())
       ​
           name = null
           println(name?.capitalize())
       }
      
    • 运行结果

      image-20220521192059776

  • let函数:匿名函数

    • 格式:变量?.let{}
    • 逻辑:当变量为空时,let{}不执行

    • let 函数细节:

      • 内部采用 it 指代调用者
      • 括号最后一行为let的返回值
    • 代码: “” 与 null 是两回事

       fun main(){
           var name : String = ""
       ​
           var res = name?.let{
               if(it.isBlank()){
                   println("这个变量是空值")
                   "空值"
               }else{
                   "[$name]"
               }
           }
       ​
           println("打印let函数的返回结果--->$res")
       }
      
    • 运行结果:

      图片.png

  • 断言(!!):可能存在空指针异常

    • 格式:变量 !!. 业务代码

    • 逻辑:无论变量是否为null,业务代码均会执行

    • 场景:对已赋值可空变量,消除编译器异常

    • 代码:

       fun main(){
           var name:String ?= "value"
       ​
           name!!.let {
               println(name)
           }
       ​
           name = null
           name !!. let{
       ​
           }
       }
      
    • 运行结果:

      图片.png

  • 采用 if 语句:跟 Java一样

    • 代码:

       fun main(){
           var name :String ?= null
           if(name == null){
               println("name此时为null")
           }else{
               println("name此时不为null,其值为$name")
           }
       }
      
    • 运行结果

      图片.png

  • 空合并操作符 ?:

    • 格式:变量 ?: 业务代码

    • 逻辑:变量为空,执行业务代码

    • 代码一:name不为空

       fun main(){
           var name : String ?= "WA"
       ​
           println("打印name值  $name" ?: "此时name为空")
       ​
           //配合let函数
           println(name ?. let{"name不为空"} ?: "此时name为空")
       }
      
    • 运行截图一:

      图片.png

    • 代码二:name为空

       fun main(){
           var name : String ?= "WA"
           name = null
           println("打印name值  $name" ?: "此时name为空")
       ​
           //配合let函数
           println(name ?. let{"name不为空"} ?: "此时name为空")
       }
      
    • 运行截图二:

      图片.png