/**
* 1.這里使用了可空類型贴硫?榴鼎,?可以加載任何類型那個(gè)的后面來(lái)表示這個(gè)類型的變 量可以為null订雾;
2.可空類型的變量在使用的時(shí)候不能直接調(diào)用它的方法夺溢,也不能把可空類型的值傳給非空類型
*/
fun strLen(s:String?): Int = s.length //不能直接調(diào)用length方法
val x:String? = null
var y:String = x
上面x為可用類型的登澜,y為非可空類型淹辞,現(xiàn)在把可空類型的x賦值給非可空類型的y會(huì)報(bào)錯(cuò):Type mismatch;
同樣也不能把一個(gè)可空類型的值傳給擁有非可空類型參數(shù)的函數(shù)如:strLen(x)傳遞給strLen(x:String)
?.安全調(diào)用運(yùn)算符
fun strLen(s:String?): Int = s.length //不能直接調(diào)用length方法
//如果增加了null檢查之后,就可以直接調(diào)用s.length了
fun strLen(s:String?):Int = if(s!= null) s.length else 0
//但是如果每個(gè)可空類型都這樣檢查顯得特別累贅竭翠,此時(shí)就用到了安全調(diào)用運(yùn)算符?.
s?.length 就相當(dāng)于 if(s != null) s.length else null
//如果s不為null就執(zhí)行方法振坚,如果為空就返回null
?: Elvis運(yùn)算符(null 合并運(yùn)算符)
使用?:運(yùn)算符可以檢查當(dāng)檢查結(jié)果為空的時(shí)候的返回值
fun foo(s:String?){
val t:String = s?: "" //如果?:左邊的值不為空則返回左邊的值,如果為空返回null
}
a?.person?.name?:"UNKNOWN" //如果?:左邊為空則返回“UNKNOWN”
//和throw運(yùn)算符同時(shí)使用
//如果不為空就返回name斋扰,如果為空就拋出一個(gè)有意義的錯(cuò)誤渡八,而不是NullPointException
a?.person?.name?:thow illegalargumentexception("Unknown name")
注意:“”不屬于null的實(shí)例如:""?:"UNKNOWN" //結(jié)果為""
as? 安全轉(zhuǎn)換運(yùn)算符
嘗試把值轉(zhuǎn)換成給定的類型,如果類型不適合返回null
foo as传货? Type -> foo is Type return (foo as Type)
-> foo !is Type return null
as屎鳍?和?:聯(lián)合使用
object as? Person ?: "not human"
object as? Person ?: return false
!!非空斷言(Kotlin不推薦使用非空斷言,通常我們會(huì)用?:來(lái)防止程序運(yùn)行時(shí)報(bào)空指針異常)
如果值為null就拋出NullPointerException空指針異常
var s:String = s!! //如果s為null則會(huì)拋出空指針異常问裕,并且異常會(huì)指向使用!!的這一行
//但是千萬(wàn)不要連續(xù)使用斷言!!
student!!.person!!.name //如果報(bào)空指針異常了則無(wú)法判斷到底是student為空還是person為空逮壁,所以不要連續(xù)使用斷言!!
let函數(shù)和?.同時(shí)使用來(lái)處理可空表達(dá)式
let函數(shù)只有左側(cè)表達(dá)式不為空的時(shí)候才會(huì)調(diào)用
person?.let{//內(nèi)部it一定是非空的
//如果person為空就不會(huì)調(diào)用let函數(shù)
}
run函數(shù)(函數(shù)內(nèi)使用this代替本對(duì)象)
返回值為函數(shù)最后一行或者return指定的表達(dá)式
class TestBean{
var name: String = "Any"
var age: Int = 18
var sex: String = "girl"
fun setData(name:String ="麗麗" ,age:Int =18,sex:String = "boy"){
}
}
var result = testBean.run{
Log.i("CB","run 函數(shù) this = "+this)//this代表當(dāng)前的testBean
this?.age = 17
this?.age
//this?.name
}
Log.i("CB","run 的返回值= $result")
//返回結(jié)果為:
run 函數(shù) this = TestBean@2ff4acd0
run 的返回值 = 18
//run 的返回值 = lily