Kotlin實用語法糖空安全類型轉(zhuǎn)換及相等性判斷
前言
Kotlin被Google官方認為是Android開發(fā)的一級編程語言。今天,我將主要講解,關(guān)于Kotlin的一些實用語法糖,主要包括:
- 范圍使用:in、downTo、step、until
- 類型檢查 & 轉(zhuǎn)換:is、智能轉(zhuǎn)換、as
- 相等性:equals()、== 、 ===
- 空安全
1. 范圍使用
主要用于表示范圍,主要包括:in、downTo、step、until
/** * 1. in * 作用:在...范圍內(nèi) **/ // 表示:若i在1-5范圍內(nèi),則執(zhí)行下面代碼 // 注:閉區(qū)間,[1,5] if (i in 1..5) { println("i 在 1-5 內(nèi)") } // 表示:若i不在1-5范圍內(nèi),則執(zhí)行下面代碼 // !in表示不在...范圍內(nèi) if (i !in 1..5) { println("i 不在 1-5 內(nèi)") } /** * 2. until * 作用:表示開區(qū)間 **/ // 輸出1234 for (i in 1 until 5) { println(i) } /** * 3. downTo * 作用:倒序判斷 **/ for (i in 5 downTo 1) { println(i) } /** * 4. step * 作用:調(diào)整步長 **/ // 設(shè)置步長為2,順序輸出1、3、5 for (i in 1..5 step 2) println(i) // 設(shè)置步長為2,倒序輸出5、3、1 for (i in 1 downTo 5 step 2) println(i)
2. 類型檢查 & 轉(zhuǎn)換
包括:is、智能轉(zhuǎn)換 和 as
/** * 1. is * 作用:判斷一個對象與指定的類型是否一致 **/ // 判斷變量a的數(shù)據(jù)類型是否是String var a: Any = "a" if (a is String) { println("a是String類型") } if (a !is Int) { println("a不是Int類型") } /** * 2. 智能轉(zhuǎn)換 * 說明: kotlin不必使用顯式類型轉(zhuǎn)換操作,因為編譯器會跟蹤不可變值的is檢查以及顯式轉(zhuǎn)換,并在需要時自動插入(安全的)轉(zhuǎn)換 **/ var a: Any = "a" if (a is String) { println("a是String類型") println(a.length) // a 自動轉(zhuǎn)換為String類型 //輸出結(jié)果為:1 } // 反向檢查: a自動轉(zhuǎn)換為String類型 if (a !is String) { print(a.length) } // 在 && 和 || 的右側(cè)也可以智能轉(zhuǎn)換: // `&&` 右側(cè)的 a 自動轉(zhuǎn)換為String if (a is String && a.length > 0) // `||` 右側(cè)的 a 自動轉(zhuǎn)換為String if (a is String || a.length > 0) // 在when表達式和while循環(huán)里也能智能轉(zhuǎn)換: when(a){ is String -> a.length is Int -> a + 1 } // 需要注意:當(dāng)編譯器不能保證變量在檢查和使用之間不可改變時,智能轉(zhuǎn)換不能用。智能轉(zhuǎn)換能否適用根據(jù)以下規(guī)則: // 1. val 局部變量——總是可以,局部委托屬性除外; // 2. val 屬性——如果屬性是 private 或 internal,或者該檢查在聲明屬性的同一模塊中執(zhí)行。智能轉(zhuǎn)換不適用于 open 的屬性或者具有自定義 getter 的屬性; // 3. var 局部變量——如果變量在檢查和使用之間沒有修改、沒有在會修改它的 lambda 中捕獲、并且不是局部委托屬性; // 4. var 屬性——決不可能(因為該變量可以隨時被其他代碼修改) /** * 3. 強制類型轉(zhuǎn)換:as **/ var any: Any = "abc" var str: String = any as String // 強制類型轉(zhuǎn)換是不安全的,若類型不兼容則會拋出一個異常 var int: Int = 123 var str: String = int as String // 拋出ClassCastException /** * 4. 可空轉(zhuǎn)換操作符:as? * 作用:null不能轉(zhuǎn)換為String,因該類型不是可空的,此時使用可空轉(zhuǎn)換操作符as? **/ var str = null var str2 = str as String // 拋出TypeCastException // 使用安全轉(zhuǎn)換操作符as?可以在轉(zhuǎn)換失敗時返回null,避免了拋出異常。 var str = null var str2 = str as? String println(str2) //輸出結(jié)果為:null
3. 相等性判斷
在Kotlin中,存在結(jié)構(gòu)相等 & 引用相等 兩種相等判斷。
/** * 1. 結(jié)構(gòu)相等:equals()或 == * 作用:判斷兩個結(jié)構(gòu)是否相等 **/ var a = "1" var b = "1" if (a.equals(b)) { println("a 和 b 結(jié)構(gòu)相等") // 輸出結(jié)果為:a 和 b 結(jié)構(gòu)相等 } var a = 1 var b = 1 if (a == b) { println("a 和 b 結(jié)構(gòu)相等") // 輸出結(jié)果為:a 和 b 結(jié)構(gòu)相等 } /** * 2. 引用相等:=== * 作用:判斷兩個引用是否指向同一對象 */ // 設(shè)置一個類如下 data class User(var name: String, var age: Int) // 設(shè)置值 var a = User("Czh", 22) var b = User("Czh", 22) var c = b var d = a // 對比兩個對象的結(jié)構(gòu) if (c == d) { println("a 和 b 結(jié)構(gòu)相等") } else { println("a 和 b 結(jié)構(gòu)不相等") } // 對比兩個對象的的引用 if (c === d) { println("a 和 b 引用相等") } else { println("a 和 b 引用不相等") } // 輸出結(jié)果: a 和 b 結(jié)構(gòu)相等 a 和 b 引用不相等
4. 空安全
- 在Java中,NullPointerException異常十分常見
- 而Kotlin的優(yōu)點則是可以盡可能避免執(zhí)行代碼時出現(xiàn)的空指針異常
/** * 1. 可空類型與非空類型 * 在Kotlin中,有兩種情況最可能導(dǎo)致出現(xiàn)NullPointerException **/ // 情況1:顯式調(diào)用 throw NullPointerException() // 情況2:使用!! 操作符 // 說明:!!操作符將任何值轉(zhuǎn)換為非空類型,若該值為空則拋出異常 var a = null a!! // 拋出KotlinNullPointerException // 情況3:數(shù)據(jù)類型不能為null // 在 Kotlin 中,類型系統(tǒng)區(qū)分一個引用可以容納 null (可空引用) 和 不能容納(非空引用) // 如:String類型變量不能容納null // 若要允許為空,可聲明一個變量為可空字符串:在字符串類型后面加一個問號? 對于String,則是寫作:String? var b: String? = "b" b = null /** * 2. 安全調(diào)用操作符 * 作用:表示如果若不為null才繼續(xù)調(diào)用 **/ b?.length // 表示:若b不為null,才調(diào)用b.length // 注:安全調(diào)用符還可以鏈?zhǔn)秸{(diào)用 a?.b?.c?.d // 假設(shè)a不為null,才繼續(xù)往下調(diào)用,以此類推 // 若該鏈?zhǔn)秸{(diào)用中任何一個屬性為null,整個表達式都會返回null。 // 若只對非空值執(zhí)行某個操作,可與let一起使用 a?.b?.let { println(it) }
至此,關(guān)于Kotlin
的入門語法講解完畢,更多關(guān)于Kotlin空安全類型轉(zhuǎn)換相等性判斷的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 照片選擇區(qū)域功能實現(xiàn)示例
這篇文章主要介紹了Android 照片選擇區(qū)域功能實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Android使用Retrofit實現(xiàn)自定義Converter解析接口流程詳解
Retrofit是一個RESTful的HTTP網(wǎng)絡(luò)請求框架的封裝,網(wǎng)絡(luò)請求的工作本質(zhì)上是OkHttp完成,而Retrofit僅負責(zé)網(wǎng)絡(luò)請求接口的封裝2023-03-03如何調(diào)用百度地圖API實現(xiàn)手機自動定位
api手機自動定位,通過聲明地址解析器,獲取當(dāng)前坐標(biāo),如何調(diào)用百度地圖api實現(xiàn)手機自動定位呢?接下來,一起跟小編來學(xué)習(xí)吧。2015-09-09Android編程自定義title bar(標(biāo)題欄)示例
這篇文章主要介紹了Android編程自定義title bar(標(biāo)題欄)的方法,結(jié)合實例形式分析了Android針對標(biāo)題欄的設(shè)置與頁面布局操作相關(guān)技巧,需要的朋友可以參考下2016-10-10實例解析如何在Android應(yīng)用中實現(xiàn)彈幕動畫效果
這篇文章主要介紹了如何在Android應(yīng)用中實現(xiàn)彈幕動畫效果的實例,文中是利用RelativeLayout布局然后控制ViewGroup中view的顯示,細節(jié)展示得比較詳細,需要的朋友可以參考下2016-04-04Android動態(tài)更換應(yīng)用圖標(biāo)詳情
這篇文章主要介紹了Android動態(tài)更換應(yīng)用圖標(biāo)詳情,文章圍繞主題展開詳細的介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07android使用AsyncTask實現(xiàn)多線程下載實例
這篇文章主要介紹了android使用AsyncTask實現(xiàn)多線程下載實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02