前言
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
的入門語法講解完畢。
5. 總結
- 本文介紹了Kotlin的一些實用語法糖
- 接下來推出的文章,我將繼續講解Kotlin的相關知識,包括使用、語法特點等,感興趣的讀者可以繼續關注我的博客哦:Carson_Ho的Android博客