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

