Kotlin實用語法糖空安全類型轉換及相等性判斷
更新時間:2022年06月23日 15:22:09 作者:Carson.Ho
這篇文章主要為大家介紹了Kotlin實用語法糖空安全類型轉換及相等性判斷示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
前言
Kotlin被Google官方認為是Android開發(fā)的一級編程語言。今天,我將主要講解,關于Kotlin的一些實用語法糖,主要包括:
- 范圍使用:in、downTo、step、until
- 類型檢查 & 轉換:is、智能轉換、as
- 相等性:equals()、== 、 ===
- 空安全
1. 范圍使用
主要用于表示范圍,主要包括:in、downTo、step、until
/** * 1. in * 作用:在...范圍內 **/ // 表示:若i在1-5范圍內,則執(zhí)行下面代碼 // 注:閉區(qū)間,[1,5] if (i in 1..5) { println("i 在 1-5 內") } // 表示:若i不在1-5范圍內,則執(zhí)行下面代碼 // !in表示不在...范圍內 if (i !in 1..5) { println("i 不在 1-5 內") } /** * 2. until * 作用:表示開區(qū)間 **/ // 輸出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循環(huán)里也能智能轉換: when(a){ is String -> a.length is Int -> a + 1 } // 需要注意:當編譯器不能保證變量在檢查和使用之間不可改變時,智能轉換不能用。智能轉換能否適用根據以下規(guī)則: // 1. val 局部變量——總是可以,局部委托屬性除外; // 2. val 屬性——如果屬性是 private 或 internal,或者該檢查在聲明屬性的同一模塊中執(zhí)行。智能轉換不適用于 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的優(yōu)點則是可以盡可能避免執(zhí)行代碼時出現的空指針異常
/** * 1. 可空類型與非空類型 * 在Kotlin中,有兩種情況最可能導致出現NullPointerException **/ // 情況1:顯式調用 throw NullPointerException() // 情況2:使用!! 操作符 // 說明:!!操作符將任何值轉換為非空類型,若該值為空則拋出異常 var a = null a!! // 拋出KotlinNullPointerException // 情況3:數據類型不能為null // 在 Kotlin 中,類型系統(tǒng)區(qū)分一個引用可以容納 null (可空引用) 和 不能容納(非空引用) // 如:String類型變量不能容納null // 若要允許為空,可聲明一個變量為可空字符串:在字符串類型后面加一個問號? 對于String,則是寫作:String? var b: String? = "b" b = null /** * 2. 安全調用操作符 * 作用:表示如果若不為null才繼續(xù)調用 **/ b?.length // 表示:若b不為null,才調用b.length // 注:安全調用符還可以鏈式調用 a?.b?.c?.d // 假設a不為null,才繼續(xù)往下調用,以此類推 // 若該鏈式調用中任何一個屬性為null,整個表達式都會返回null。 // 若只對非空值執(zhí)行某個操作,可與let一起使用 a?.b?.let { println(it) }
至此,關于Kotlin
的入門語法講解完畢,更多關于Kotlin空安全類型轉換相等性判斷的資料請關注腳本之家其它相關文章!
相關文章
Android使用Retrofit實現自定義Converter解析接口流程詳解
Retrofit是一個RESTful的HTTP網絡請求框架的封裝,網絡請求的工作本質上是OkHttp完成,而Retrofit僅負責網絡請求接口的封裝2023-03-03