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 異常
as?運算子嘗試把值轉換成制定型別,沒有合適的型別就返回null
troll as?Type => if(troll is Type){ troll as Type}
if(troll !is Type){ null}
複製程式碼
非空斷言 : “ !!”
非空斷言是kotlin最簡單的處理可空型別值的工具
type !! => if(type !=null){ type} else{NullPointerException}
複製程式碼
“let”函式
let函式可以處理可空表示式變得更加簡繁,和安全呼叫運算子一起,允許對錶達式求值,檢查求值結果是否為null,並且把結果儲存為一個變數
type ?.let{相應的處理} => if(type !=null){ 進行lambda內部相對應處理}else{ 什麼都不發生}
複製程式碼
延遲初始化屬性 lateinit
Android 中,Activity的初始化發生在onCreate方法中
延遲初始化的屬性都是var,因為需要在構造方法外修改它的值,而val屬性會被編譯成必須在構造方法中初始化的final欄位。
lateinit 屬性常見是依賴注入,lateinit屬性的值是被依賴注入框架從外部設定的, 為了保證和各種Java(依賴注入)框架的相容性,Kotlin會自動生成一個和lateinit屬性具有相同可見性的欄位。
可空型別的擴充套件
可空型別定義擴充套件函式是一種強大的處理null值的方式,允許接收者為null的擴充套件函式呼叫,並在改函式中處理null,而不是在確保變數不為null之後再呼叫它的方法。
- String的標準函式庫中有isEmpty和isBlank