kotlin 由淺入深(五)基本語法(空安全、轉換、區間)

weixin_33866037發表於2018-04-17

空安全

  • 可空型別和非空型別 ?
        // 1、普通的 String 型別的變數不能為空
        var a: String ="abc"
        // a = null  //編譯錯誤 - 直接在 AS 上報錯
        // 直接呼叫,不用擔心空指標異常
        a.length

        // 2、? 符號,宣告為可空的變數(允許為空)
        var b: String? = "abc"
        b = null
        // b.length  b有可能為空,直接呼叫報錯
  • 在條件中檢查 null
        // 3、在條件中檢查 b 是否為空
        val c = if (b != null) b.length else -1
  • 安全呼叫 ?.
        // 4、安全操作符 ?. 如果 b 不為空則返回長度,否則返回空。這個表示式的的型別是 Int?
        b?.length

        // 5、安全呼叫在鏈式呼叫是很有用的
        *?.*?.*?.*
  • Elvis 操作符 ?:
  // 6、如果 ?: 左邊表示式不為空則返回,否則返回右邊的表示式。注意右邊的錶帶式只有在左邊表示式為空是才會執行
  val d = b?.length ?:  -1

   // 7、注意在 Kotlin 中 throw return 是表示式,所以它們也可以在 Elvis 操作符右邊
   fun foo(node: Node): String? {
        val parent = node.getParent() ?: return null
        val name = node.getName() ?: throw IllegalArgumentException("name expected")
    }
  • !! 操作符
        // 8、返回一個非空的 b 或者丟擲一個 b 為空的 NPE
        val l = b !!.length
  • 安全轉換
        // 9、普通的轉換可能產生 ClassCastException 異常。另一個選擇就是使用安全轉換,如果不成功就返回空
        val aInt: Int? = a as? Int

使用值檢查並自動轉換

  • is !is 表示式
    檢查一個物件是否是某個特定型別
if (obj is String) {
}
  • 智慧轉換
fun demo(x: Any) {
    if (x is String) {
       // 做過型別判斷以後,obj會被系統自動轉換為String型別
        print(x.length)
    }
}
  • 不安全”的轉換符
注意 null 不能被轉換為 `String` 因為它不是 `nullable`也就是說如果 `y` 是空的,則上面的程式碼會丟擲空異常。
val x: String = y as String
  • "安全"轉換符
    為了避免丟擲異常,可以用 as? 這個安全轉換符,這樣失敗就會返回 null
不管 as? 右邊的是不是一個非空 String 結果都會轉換為可空的。
val x: String ?= y as? String

區間range

操作符形式 .., in 和 !in 與其配合使用

for (i in 1..4) print(i) // 輸出“1234”

for (i in 4..1) print(i) // 什麼都不輸出

if (i in 1..10) { // 等同於 1 <= i && i <= 10
    println(i)
}

// 使用 step 指定步長
for (i in 1..4 step 2) print(i) // 輸出“13”

for (i in 4 downTo 1 step 2) print(i) // 輸出“42”

// 使用 until 函式排除結束元素
for (i in 1 until 10) {   // i in [1, 10) 排除了 10
     println(i)
}

相關文章