-
可空性
val x: String? = null //pass val x: String = nul //error val y: String = x //error
- 安全調(diào)用
fun toUpper(str: String?) = str?.toUpperCase() toUpper("string") // STRING toUpper(null) // null obj?.p1?.p2?.p3 //中間有一個為null則為空
- Elvis運算符: ?:
fun toUpper(str: String?) = str?.toUpperCase() ?: "" //若str是空則返回"" val result = value?.prop ?: throw Error() //可以拋異常
- 安全轉(zhuǎn)換符: as?
val result = value as? Type // 若value 不是Type返回null val result = value as厉斟?Type ?: return false //結(jié)合Elvis表達式
- 非空斷言: !! (少用)
val x: String? = "a" x!!.toUpperCase() //明確告訴編譯器x不是空 obj!!.x!!.toUpperCase() //強烈不建議寫法股毫,調(diào)用棧無法跟蹤異常色迂,發(fā)生異常不知道是obj是null還是x是null
- let函數(shù)
email?.let{ send(it) }
- 延遲初始化的屬性
對Java依賴注入很有用
對Activity 在onCreate初始化值及類似的很有用
class MyService{ fun performAction(): String = "foo" } --------------------------------------------------------------- class MyTest{ private var myService: MyService? = null //必須初始化值 @Before fun setUp() { myService = MyService() } @Test fun testAction() { Assert.assertEquals("foo",myService!!.performAction()) } } --------------------------------------------------------------- class MyTest{ private lateinit var myService: MyService // 延遲初始化 @Before fun setUp() { myService = MyService() } @Test fun testAction() { Assert.assertEquals("foo",myService.performAction()) } }
- 可空性的擴展
像String類的isNullOrBlank落塑,isEmptyOrNull 等方法不用安全調(diào)用
val input: String? = null input.isNullOrBlank() //不用安全調(diào)用 方法定義如下 String?.isNullOrBlank() : Boolean = this == null || this.isBlank()
- 類型參數(shù)的Null Safety
fun <T> printHashCode(t: T) = t?.hashCode() // T == Any? fun <T: Any> printHashCode(t: T) = t.hashCode() // T == Any
- Null Safety java-kotlin
1.@Nullable注解 JSR-305纺阔、Android、JetBrains工具的@Nullable + Type = Type? @NotNull + Type = Type
平臺類型
public class MyObj {
private String perporty;
public MyObj(String perporty) {
this.perporty = perporty;
}
public String getPerporty() {
return perporty;
}
}
/*Kotlin*/
//在Kotlin中perporty為平臺類型(不能確定是非空乙濒,還是可空類型)
MyObj(null).perporty.toUpperCase() //java.lang.IllegalStateException: MyObj(null).perporty must not be null ...
MyObj(null).perporty?.toUpperCase() ?: "" //建議處理空
/* important */
繼承也要注意從Java繼承的非空判斷
- Java的八大基本數(shù)據(jù)類型對kotlin來說都是非空類型而非平臺類型(int,boolean,short...等不能為null)
- kotlin對數(shù)組類型的轉(zhuǎn)換必須是顯式的
- Unit類型 ~= void
- Nothing類型 P164 沒大看懂
- 集合與數(shù)組
- 可空性集合
ArrayList<Int?>() ArrayList<Int?>()? ArrayList<Int>()?
- 只讀集合和可變集合
kotlin.collections.Collection //只讀 kotlin.collections.MutableCollection //可增刪 創(chuàng)建不可變集合 listOf毁嗦、setOf、mapOf 創(chuàng)建可變集合 mutableListOf娘纷、mutableSetOf嫁审、mutableMapOf、arrayListOf赖晶、hashSetOf律适、hashMapOf...
- 由于Java沒有可變集合一說,所以在Java的集合當(dāng)做平臺類型(無法區(qū)分可變不可變遏插,可空不可空)
- Java數(shù)組對應(yīng)kotlin
kotlin的Array 編譯成Java數(shù)組
基本數(shù)據(jù)類型使用像IntArray的特殊類表示