亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Kotlin實用語法糖空安全類型轉(zhuǎn)換及相等性判斷

 更新時間:2022年06月23日 15:22:09   作者:Carson.Ho  
這篇文章主要為大家介紹了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)文章

最新評論