Kotlin學(xué)習(xí)筆記:概述
Kotlin學(xué)習(xí)筆記:基本語法和函數(shù)
Kotlin學(xué)習(xí)筆記:類和接口
Kotlin學(xué)習(xí)筆記:lambda編程
Kotlin學(xué)習(xí)筆記:類型系統(tǒng)
Kotlin學(xué)習(xí)筆記:泛型
Kotlin學(xué)習(xí)筆記:注解和反射
Null 類型處理
Kotlin類型系統(tǒng)解決了空指針問題。解決方式是將運行時的錯誤轉(zhuǎn)變成編譯時錯誤溢豆。
在Kotlin中尚蝌,默認情況下鞋屈,變量不能存儲null引用旺韭,否則編譯時報錯胶坠。
fun strLen(s: String) = s.length
strLen(null) //編譯不通過
- 可null操作符(?)
若需要變量為null挂谍,可以使用叔壤?操作符。一旦有一個可null類型的值口叙,對它的操作也會受限制炼绘。
不能把它賦值給非null類型的對象
val str:String? = null
val str2:String = str // 編譯不通過
也不能把可null類型的對象傳給擁有非null類型參數(shù)的函數(shù)。
val str: String? = null
strLen(str) // 編譯不通過
如果一定要調(diào)用strLen方法庐扫,需要將方法進行null處理
fun strLen2(s:String?):Int = if (s!=null) s.length else 0
val str: String? = null
strLen(str) // 正常運行饭望,返回0
- 安全調(diào)用運算符(?.)
安全調(diào)用運算符允許把一次null檢查和一次方法調(diào)用合并成一個操作。
例如
str?.toUpperCase()
等價于
if (str != null) str.toUpperCase() else null
- Elvis運算符(?:)
elvis 接收兩個運算數(shù)形庭,如果第一個運算數(shù)不為null铅辞,則返回第一個運算數(shù);如果為null萨醒,則返回第二個運算數(shù)斟珊。
- 安全轉(zhuǎn)換(as?)
- 非null斷言(!!)
- let函數(shù)
let函數(shù)可以用于處理可null表達式,它允許對表達式進行求值富纸,并判斷它是否為null囤踩。
舉例
有一個發(fā)送郵件的函數(shù)
fun sendEmailTo(email: String) { /*...*/ }
調(diào)用發(fā)送郵件函數(shù)。由于email可以為null晓褪,編譯不能通過堵漱。
>>> val email: String? = ...
>>> sendEmailTo(email)
ERROR: Type mismatch: inferred type is String? but String was expected
可以進行null判斷
if (email != null) sendEmailTo(email)
也可以使用let函數(shù)
email?.let { email -> sendEmailTo(email) }
基本類型
與Java不同,Kotlin不區(qū)分基本數(shù)據(jù)類型和引用類型涣仿。在大多數(shù)情況下勤庐,Int類型會被編譯為java的int類型示惊。在一些情況下,比如作為泛型的類型參數(shù)時愉镰,會被編譯為Java的Integer類型米罚。
對應(yīng)到Java基本類型的類型完整列表如下:
整數(shù)類型—Byte, Short, Int, Long
浮點數(shù)類型—Float, Double
字符類型—Char
布爾類型—Boolean
- Any:Any類型是所有類型的父類,類似于Java的Object
- Unit:類似于Java的void丈探。
- Nothing:沒有任何值录择,只有被當做返回值使用或者當做泛型函數(shù)返回值的類型參數(shù)
集合
Kotlin 沒有實現(xiàn)自己的集合框架,而是使用的Java的集合框架 碗降。因此隘竭,本質(zhì)上每一個Kotlin集合接口都對應(yīng)著一個Java集合接口的實例。
與Java不同的是遗锣,Kotlin的集合分為兩種货裹,一種是只讀集合,一種是可變集合精偿。
集合創(chuàng)建函數(shù)列表
集合類型 | 只讀 | 可變 |
---|---|---|
List | listOf() | arrayListOf() |
Set | setOf | hashSetOf(), linkedSetOf(), sortedSetOf() |
Map | mapOf | hashMapOf(), linkedMapOf(), sortedMapOf() |