首頁 > 軟體

Kotlin實用語法糖空安全型別轉換及相等性判斷

2022-06-23 18:01:58

前言

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的入門語法講解完畢,更多關於Kotlin空安全型別轉換相等性判斷的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com