Kotlin實用的語法糖:空安全、類型轉換 & 相等性判斷

前言

Kotlin被Google官方認爲是Android開發的一級編程語言。今天,我將主要講解,關於Kotlin的一些實用語法糖,主要包括:

  • 範圍使用:in、downTo、step、until
  • 類型檢查 & 轉換:is、智能轉換、as
  • 相等性:equals()、== 、 ===
  • 空安全

示意圖


1. 範圍使用

主要用於表示範圍,主要包括:in、downTo、step、until

/**
 *  1. in
 *  作用:在...範圍內
 **/
// 表示:若i在1-5範圍內,則執行下面代碼
// 注:閉區間,[1,5]
if (i in 1..5) {
    println("i 在 1-5 內")
}

// 表示:若i不在1-5範圍內,則執行下面代碼
// !in表示不在...範圍內
if (i !in 1..5) {
    println("i 不在 1-5 內")
}

/**
 *  2. until
 *  作用:表示開區間
 **/
// 輸出1234
for (i in 1 until 5) {
 println(i)
}

/**
 *  3. downTo
 *  作用:倒序判斷
 **/
 for (i in 5 downTo 1) {
 	println(i)
 }

/**
 *  4. step
 *  作用:調整步長
 **/
// 設置步長爲2,順序輸出1、3、5
for (i in 1..5 step 2) println(i) 

// 設置步長爲2,倒序輸出5、3、1
for (i in 1 downTo 5 step 2) println(i) 

2. 類型檢查 & 轉換

包括:is、智能轉換 和 as

/**
 *  1. is
 *  作用:判斷一個對象與指定的類型是否一致
 **/
// 判斷變量a的數據類型是否是String
var a: Any = "a"
if (a is String) {
    println("a是String類型")
}
if (a !is Int) {
    println("a不是Int類型")
}

/**
 *  2. 智能轉換
 *  說明: kotlin不必使用顯式類型轉換操作,因爲編譯器會跟蹤不可變值的is檢查以及顯式轉換,並在需要時自動插入(安全的)轉換
 **/
 var a: Any = "a"
if (a is String) {
    println("a是String類型")
    println(a.length) // a 自動轉換爲String類型
    //輸出結果爲:1
}

// 反向檢查: a自動轉換爲String類型
if (a !is String) {
	print(a.length)
}

// 在 && 和 || 的右側也可以智能轉換:
// `&&` 右側的 a 自動轉換爲String
if (a is String && a.length > 0)
// `||` 右側的 a 自動轉換爲String
if (a is String || a.length > 0)

// 在when表達式和while循環裏也能智能轉換:
when(a){
    is String -> a.length
    is Int -> a + 1
}

// 需要注意:當編譯器不能保證變量在檢查和使用之間不可改變時,智能轉換不能用。智能轉換能否適用根據以下規則:
// 1. val 局部變量——總是可以,局部委託屬性除外;
// 2. val 屬性——如果屬性是 private 或 internal,或者該檢查在聲明屬性的同一模塊中執行。智能轉換不適用於 open 的屬性或者具有自定義 getter 的屬性;
// 3. var 局部變量——如果變量在檢查和使用之間沒有修改、沒有在會修改它的 lambda 中捕獲、並且不是局部委託屬性;
// 4. var 屬性——決不可能(因爲該變量可以隨時被其他代碼修改)

/**
 *  3. 強制類型轉換:as
 **/
var any: Any = "abc"
var str: String = any as String

// 強制類型轉換是不安全的,若類型不兼容則會拋出一個異常
var int: Int = 123
var str: String = int as String
// 拋出ClassCastException

/**
 *  4. 可空轉換操作符:as?
 *  作用:null不能轉換爲String,因該類型不是可空的,此時使用可空轉換操作符as?
 **/
var str = null
var str2 = str as String
// 拋出TypeCastException

// 使用安全轉換操作符as?可以在轉換失敗時返回null,避免了拋出異常。
var str = null
var str2 = str as? String
println(str2) //輸出結果爲:null

3. 相等性判斷

在Kotlin中,存在結構相等 & 引用相等 兩種相等判斷。

/**
 *  1. 結構相等:equals()或 ==
 *  作用:判斷兩個結構是否相等
 **/
var a = "1"
var b = "1"
if (a.equals(b)) {
    println("a 和 b 結構相等")
    // 輸出結果爲:a 和 b 結構相等
}

var a = 1
var b = 1
if (a == b) {
    println("a 和 b 結構相等")
    // 輸出結果爲:a 和 b 結構相等
}

/**
 *  2. 引用相等:===
 *  作用:判斷兩個引用是否指向同一對象
 */ 
// 設置一個類如下
data class User(var name: String, var age: Int)

// 設置值
var a = User("Czh", 22)
var b = User("Czh", 22)
var c = b
var d = a

// 對比兩個對象的結構
if (c == d) {
    println("a 和 b 結構相等")
} else {
    println("a 和 b 結構不相等")
}

// 對比兩個對象的的引用
if (c === d) {
    println("a 和 b 引用相等")
} else {
    println("a 和 b 引用不相等")
}

// 輸出結果:
a 和 b 結構相等
a 和 b 引用不相等

4. 空安全

  • 在Java中,NullPointerException異常十分常見
  • 而Kotlin的優點則是可以儘可能避免執行代碼時出現的空指針異常
/**
 *  1. 可空類型與非空類型
 *  在Kotlin中,有兩種情況最可能導致出現NullPointerException
 **/

// 情況1:顯式調用 throw NullPointerException()
// 情況2:使用!! 操作符
// 說明:!!操作符將任何值轉換爲非空類型,若該值爲空則拋出異常
var a = null
a!!
// 拋出KotlinNullPointerException

// 情況3:數據類型不能爲null
// 在 Kotlin 中,類型系統區分一個引用可以容納 null (可空引用) 和 不能容納(非空引用)
// 如:String類型變量不能容納null
// 若要允許爲空,可聲明一個變量爲可空字符串:在字符串類型後面加一個問號?
對於String,則是寫作:String?
var b: String? = "b"
b = null


/**
 *  2. 安全調用操作符
 *  作用:表示如果若不爲null才繼續調用
 **/
 b?.length
 // 表示:若b不爲null,才調用b.length

 // 注:安全調用符還可以鏈式調用
 a?.b?.c?.d
 // 假設a不爲null,才繼續往下調用,以此類推
 // 若該鏈式調用中任何一個屬性爲null,整個表達式都會返回null。
 // 若只對非空值執行某個操作,可與let一起使用
a?.b?.let { println(it) }

至此,關於Kotlin的入門語法講解完畢。


5. 總結

  • 本文介紹了Kotlin的一些實用語法糖
  • 接下來推出的文章,我將繼續講解Kotlin的相關知識,包括使用、語法特點等,感興趣的讀者可以繼續關注我的博客哦:Carson_Ho的Android博客

請幫頂 / 評論點贊!因爲你們的贊同/鼓勵是我寫作的最大動力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章