kotlin 由淺入深(五)基本語法(空安全、轉換、區間)
空安全
- 可空型別和非空型別 ?
// 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)
}
相關文章
- promise由淺入深Promise
- MongoDB由淺入深MongoDB
- javascript由淺入深JavaScript
- JavaScript Promise由淺入深JavaScriptPromise
- MySQL索引由淺入深MySql索引
- 物件導向-由淺入深物件
- 由淺入深,從掌握Promise的基本使用到手寫PromisePromise
- 純手寫Promise,由淺入深Promise
- Vue.js 2.0 由淺入深Vue.js
- iOS架構由淺入深 | MVVMiOS架構MVVM
- 由淺入深理解 IOC 和 DI
- Git由淺入深之分支管理Git
- 由淺入深學python(一)Python
- Git由淺入深之操作與指令Git
- 淺談Kotlin語法篇之擴充套件函式(五)Kotlin套件函式
- 由淺入深理解Dubbo的SPI機制
- 由淺入深 docker 系列: (6) 映象分層Docker
- 由淺入深 docker 系列: (2) docker 構建Docker
- 由淺入深完全理解Java動態代理Java
- 由淺入深學C# 視訊教程C#
- 由淺入深學習JavaScript Debug技巧JavaScript
- Java 反射由淺入深 | 進階必備Java反射
- Git 由淺入深之細說變基 (rebase)Git
- 由淺入深 docker 系列: (5) 資源隔離Docker
- 由淺入深 docker 系列: (3) docker-composeDocker
- 第十八節:Skywalking由淺入深
- Kotlin開發之旅《二》—Kotlin的基本語法Kotlin
- [轉帖]由淺入深瞭解GC入門篇(一):什麼是垃圾回收?GC
- 淺談Kotlin語法篇之基礎語法(一)Kotlin
- Kotlin的基本語法和型別Kotlin型別
- 前端如何理解正則-由淺入深的學習前端
- C#非同步程式設計由淺入深(一)C#非同步程式設計
- MVP架構由淺入深篇一(基礎版)MVP架構
- 【由淺入深_打牢基礎】HOST頭攻擊
- 【Fastjson】Fastjson反序列化由淺入深ASTJSON
- Git由淺入深之遠端主機(git remote)GitREM
- 由淺入深 docker 系列:(4) 容器與虛擬機器Docker虛擬機
- 【由淺入深學MySQL】- MySQL連線查詢詳解MySql