Kotlin ? 和 ?. 和 ?: 和 as? 和 !! 运算符比较

? 代表可空的数据类型

fun StrLen(s:String?):Int = s.length  //不能直接调用length方法
//1、这里使用了可空类型?,?可以加载任何类型的后面来表示这个类型的变量可以为null
//2、可空类型的变量在使用的时候不能直接调用它的方法
//3、也不能把可空类型的值传给非空类型
/**
*如 val x:String?=null  var y:String = x//把可空类型的x赋值给非空类型的y会报错:Type mismatch
*同样也不能把一个可控类型的值传给拥有非空类型参数的函数如StrLen(x) 传给  StrLen(x:String)
**/

?. 安全调用运算符  

相当于做了一个非空的判断

fun StrLen(s:String?):Int = s.length  //不能直接调用length方法
//如果增加了null检查以后,就可以直接调用s.length了,如下:
fun StrLen(s:String?):Int  = if(s!=null) s.length else 0
//但是如果每个可空类型都这样检查会显得特别累赘,此时就用到了安全调用运算符?.

s?.length 就相当于 if(s!=null) s.length else null
//如果s不为空就执行方法,如果为空就返回null

?: Elvis运算符(null合并运算符)

使用?:运算符可以设置当检查结果为空的时候的返回值,某种意义上有点像JAVA的三目运算符

fun foo(s:String?){
     val t:String  =  s ?:  "" //如果?:左边的值不为空返回左边的值,如果为空返回""
}

//可以这样使用
a?. peroson?. name ?: "UnKnown" //如果?:左边为空则返回"UnKnown"
//和throw运算符同事使用
//如果不为空就返回name,如果为空就抛出一个有意义的错误,而不是NullPointException
val name = a?.person?.name ?: throw illegalargumentexception("UnKnown name")//如果name为空就会报自定义的异常,防止下面代码调用而直接报空指针异常
println(name.length)//如果name为空就会报空指针异常

as? 安全转换运算符

尝试把值转换成给定的类型,如果类型不合适就返回null

foo as? Type -> foo is  Type  retrun (foo as Type)
             -> foo !is Type  return null

//as?和?:联合使用
object as? Person ?: "not human"
object as? Person ?: return false

!! 非空断言 (Kotlin不推荐使用非空断言,通常我们会用?:来防止程序运行时报空指针异常而崩溃)如果值为null就抛出NullPointerException空指针异常

var s:String = s!!  //如果s为null则会抛出空指针异常,并且异常会指向使用!!的这一行
println(s)//如果s为null则会抛出空指针异常
//使用断!!可以很方便的在抛出空指针异常的时候定位到异常的变量的位置
//但是千万不要连续使用断言!!
//student!!.person!!.name//如果报空指针异常了则无法判断到底是student为空还是person为空,所以不要连续使用断言!!

let函数和?.同时使用来处理可空表达式

let函数只有左侧表达式不为空的时候才会调用

person?.let{ //内部的it一定是非空的 }
//如果person为空就不会调用let函数
//如果person不为空才会调用let函数,所以?.和let函数配合使用可以很方便的处理可空表达式
person?.let { println(it.name) //输出name}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值