Kotlin學習之旅第六天
今天的主題是:Kotlin中的習慣用法-第一部分
前言
習慣用法
-
創建DTOs
-
函數的默認參數
-
過濾list
-
String字符串模板
-
類型判斷
-
遍歷Map
-
擴展函數
-
創建單例
—————————————————— Part 1
-
使用表達式
-
靜態方法
-
使用命名參數替代setter
-
使用apply()
-
處理可空對象
-
使用as替代is
-
快速創建JSON
創建DTOs
在Android中,我們經常需要創建Bean,也就是包括了setter,getter,toString等常見代碼的一種類,一般用於接收後臺返回的JSON格式的數據,在Kotlin裏面,我們可以用很簡單的語法完成Bean類的編寫:
data class Customer(val name: String, val email: String)
我們定義了一個Customer類,構造方法傳入兩個參數name, email,這個類包括以下方法:
- 所有屬性的 getters (對於 var 定義的還有 setters)
equals()
hashCode()
toString()
copy()
在Kotlin中,這種類也叫做數據類,data class,一個關鍵字即可完成之前在Java裏面需要寫的大量模板代碼,是不是很方便呢?
函數的默認參數
這個之前在講函數的時候也提到過,可以減少重載方法的數量
fun foo(a: Int = 0, b: String = ""){...}
這裏定義了一個foo函數,傳入a,b兩個參數,其中a的默認值爲0,b的默認值爲空字符串
那麼在調用foo的時候,我們可以直接寫
foo()
不傳a,b的話,就使用默認值進行運算。
過濾list
val positives = list.filter { x -> x > 0 }
或者可以更短:
val positives = list.filter { it > 0 }
String字符串模板
這個之前也提到過,就是在字符串裏面,加入其它的字符串變量,在Java中,需要通過format函數來進行賦值,在kotlin中也是變得更加簡潔:
println("Name $name")
$ 加上 變量名 就可以實現在String中插入變量的功能
類型判斷
這個特性是經常會用到的,例如在解析JSONObject,或者是需要把JSON轉成需要的數據類型時,以前的寫法
if(json.getXXX != null){
if (json.getXXX instanceOf Foo){
....
} else if (json.getXXX instanceOf Bar){
...
} else {
...
}
}
在Kotlin中,通過when + is 來實現
when (x) {
is Foo //-> ……
is Bar //-> ……
else //-> ……
}
是不是一目瞭然,媽媽再也不用擔心我看代碼看到心煩意亂了?
遍歷map/pair類型的list
for ((k, v) in map) {
println("$k -> $v")
}
如果是在Java裏面,我們需要通過key來找value,然後再輸出,代碼量又是蹭蹭的往上串
擴展函數
emmm,這個之前在函數那一篇文章裏面已經講得比較清楚了,忘了的童鞋可以重溫一下:Kotlin學習之旅(D4)-函數與Lambda表達式
直接上代碼:
fun String.spaceToCamelCase() { …… }
"Convert this to camelcase".spaceToCamelCase()
String裏面是沒有spaceToCamelCase這個方法的,但是我們又不想通過繼承讓所有子類都加上這個方法,那麼可以通過擴展函數來實現。
創建單例
單例模式我們經常都會用到,在Java裏面的寫法也是多種多樣,但是所有形式的代碼量都沒有Kotlin裏面來的簡潔:
object Resource {
val name = "Name"
}
沒錯,就是通過object關鍵字定義單例。
總結
這些習慣用法都是前人通過大量實踐總結出來的,可以提高我們的開發效率,所以我們也應該多學習這些用法,努力讓自己寫出來的代碼簡潔易懂。
Day 6 - Learn Kotlin Trip, Completed.