kotlin函數的判空檢查都是在編譯期的
可空類型 (s:String?)
問號可以加在任何類型的后面來標識這個類型的變量可以存儲null引用:
Type?= Type or null (可空類型的變量可以存儲null引用)
允許參數可空后,一些操作將會受到限制
- 不能調用自身的方法
- 不能把它賦值給非空類型的變量
- 不能把可空類型的值傳給擁有非空類型參數的函數
安全調用運算符 : "?."
?. 允許吧一次null檢查和一次方法調用合并成一個操作。安全調用不光可以調用方法,也能用來訪問屬性
type?.type => if(type !=null){ type.type}else{ null}
Elvis 運算符 : “爹土?:”
kotlin 用Elvis運算符來提供null的默認值
var s:String= type?:string => if(type==null){ s=string}else{ s=type}
可以用在return和throw返回參數
安全轉換 : “as?”
在java中類型轉換錯誤會拋出 ClassCastException 異常</br>
as?運算符嘗試把值轉換成制定類型知举,沒有合適的類型就返回null
troll as?Type => if(troll is Type){ troll as Type}
if(troll !is Type){ null}
非空斷言 : “ 0旧ァ灭必!”
非空斷言是kotlin最簡單的處理可空類型值的工具
type !! => if(type !=null){ type} else{NullPointerException}
“l(fā)et”函數
let函數可以處理可空表達式變得更加簡繁特占,和安全調用運算符一起理肺,允許對表達式求值摄闸,檢查求值結果是否為null,并且把結果保存為一個變量
type ?.let{相應的處理} => if(type !=null){ 進行l(wèi)ambda內部相對應處理}else{ 什么都不發(fā)生}
延遲初始化屬性 lateinit
Android 中妹萨,Activity的初始化發(fā)生在onCreate方法中
延遲初始化的屬性都是var年枕,因為需要在構造方法外修改它的值,而val屬性會被編譯成必須在構造方法中初始化的final字段乎完。</br>
lateinit 屬性常見是依賴注入熏兄,lateinit屬性的值是被依賴注入框架從外部設置的, 為了保證和各種Java(依賴注入)框架的兼容性囱怕,Kotlin會自動生成一個和lateinit屬性具有相同可見性的字段霍弹。
可空類型的擴展
可空類型定義擴展函數是一種強大的處理null值的方式,允許接收者為null的擴展函數調用娃弓,并在改函數中處理null,而不是在確保變量不為null之后再調用它的方法典格。
- String的標準函數庫中有isEmpty和isBlank