?. !!. ?.let和?: 的区别

本文详细介绍了Kotlin中的空安全特性,包括可空类型与非空类型的使用区别,以及?.和!!.操作符的功能与适用场景。此外,还探讨了let语句和Elvis操作符?:如何简化对可空对象的访问与处理。
部署运行你感兴趣的模型镜像
一、? 与 !! 的比较
val a: String = "aa"
    /*
    * a是非空类型,下面的给a赋值为null将会编译不通过
    * */
    // a = null
    a.length

    /*
    * ?声明是可空类型,可以赋值为null
    * */
    var b: String? = "bb"
    b = null
    
    /*
    * b是可空类型,直接访问可空类型将编译不通过,需要通过?.或者!!.来访问
    * */
    // b.length
    b?.length
    b!!.length
  • 对于一个不可为空类型:如果直接给不可为空类型赋值一个可能为空的对象就在编译阶段就不能通过
  • 对于一个可空类型:通过?声明,在访问该类型的时候直接访问不能编译通过,需要通过?.或者!!.
    • ?. 代表着如果该类型为空的话就返回null不做后续的操作,如果不为空的话才会去访问对应的方法或者属性
    • !!. 代表着如果该类型为空的话就抛出NullPointerException,如果不为空就去访问对应的方法或者属性, 所以只有在很少的特定场景才用这种符号,代表着程序不处理这种异常的case了,会像java代码一样抛出NullPointerException。 而且代码中一定不用出现下面这种代码,会让代码可读性很差而且如果有空指针异常,我们也不能马上发现是哪空了:
    /*
    * 不推荐这样的写法:链式的连续用!!.
    * */
    val user = User()
    user!!.name!!.subSequence(0,5)!!.length

二、let语句简化对可空对象对访问

  • let函数默认当前这个对象作为闭包的it参数,返回值是函数里面最后一行,或者指定return。
 * 通过let语句,在?.let之后,如果为空不会有任何操作,只有在非空的时候才会执行let之后的操作
    * */
    user?.let {
        it.name
        it.age
        it.toString()
    }


三、?: 简化对空值的处理

?:符号会在符号左边为空的情况才会进行下面的处理,不为空则不会有任何操作。跟?.let正好相反,例如我们可以用两行代码来简化上面从操作:

/**
 * Elvis操作符 ?: 简化对空值的处理
 */
fun testElvis2(input: String?, user: User?) {
    val b = input?.length ?: -1;
    user?.save() ?: User().save()
}





您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值