Kotlin 非空性總結

Troll4it發表於2018-06-04

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

相關文章