Kotlin學習之旅第七天
今天的主題是:Kotlin中的習慣用法-第二部分
前言
Kotlin學習之旅(D6)-Kotlin Idioms part 1
今日目標
- 使用表達式
- 靜態方法
- 使用命名參數替代setter
- 使用apply()
- 處理可空對象
- 使用as替代is
- 快速創建JSON
使用表達式
通過使用Lambda表達式,我們可以減少很多的代碼量,同時也會犧牲可讀性,但是我們還是鼓勵使用表達式
舉個栗子:
fun getDefaultLocale(deliveryArea: String): Locale {
val deliverAreaLower = deliveryArea.toLowerCase()
if (deliverAreaLower == "germany" || deliverAreaLower == "austria") {
return Locale.GERMAN
}
if (deliverAreaLower == "usa" || deliverAreaLower == "great britain") {
return Locale.ENGLISH
}
if (deliverAreaLower == "france") {
return Locale.FRENCH
}
return Locale.ENGLISH
}
這個函數的目的是爲了獲取正確的地區,在函數體中做了很多的判斷,每一個需要接手的人都要重新過一遍邏輯,但是由於大量的if,讀一遍代碼的速度會變慢,時間自然就會變長,那麼使用表達式的效果是怎麼樣的呢?
fun getDefaultLocale2(deliveryArea: String) = when (deliveryArea.toLowerCase()) {
"germany", "austria" -> Locale.GERMAN
"usa", "great britain" -> Locale.ENGLISH
"france" -> Locale.FRENCH
else -> Locale.ENGLISH
}
沒錯,只要6行,就能達到和上面13行代碼一樣的效果,並且可讀性上面我覺得還提升了。因爲人的大腦是習慣有關聯的東西,when表達式其實就是把並列的條件一個個列出來,對於讀代碼的人來說是很好理解的。
因此,考慮多使用 when
而不是if
靜態方法
在Kotlin裏面,沒有提供static關鍵字讓我們定義靜態的變量,方法,類,但是我們可以通過別的方式來實現
1.通過Object關鍵字
object MyUtil {
fun changeAnswer(string: String) : Int { ... }
}
使用:
MyUtil.changeAnswer("test")
2.通過擴展函數
這個在昨天的 Kotlin學習之旅(D6)-Kotlin Idioms part 1 已經講過了,所以這裏就不再重複了。
使用命名參數替代setter
在Java裏面,我們通過setXXX這樣的命名方法來區分每個參數
val config = SearchConfig()
.setRoot("~/folder")
.setTerm("kotlin")
.setRecursive(true)
.setFollowSymlinks(true)
在Kotlin裏面,我們通過直接給參數命名~
val config2 = SearchConfig2(
root = "~/folder",
term = "kotlin",
recursive = true,
followSymlinks = true
)
簡潔又明瞭:參數名 = "參數值"
使用apply()
這個用法和上面的差不多
val dataSource = BasicDataSource()
dataSource.driverClassName = "com.mysql.jdbc.Driver"
dataSource.url = "jdbc:mysql://domain:3309/db"
dataSource.username = "username"
dataSource.password = "password"
dataSource.maxTotal = 40
dataSource.maxIdle = 40
dataSource.minIdle = 4
常規操作是這樣的,那麼Kotlin有什麼騷操作呢?
val dataSource = BasicDataSource().apply {
driverClassName = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://domain:3309/db"
username = "username"
password = "password"
maxTotal = 40
maxIdle = 40
minIdle = 4
}
同樣的道理,通過apply()
後面也是 參數名 = "參數值"
就搞定了
處理可空對象
大家都知道,Kotlin默認是空安全的,但是也支持可空對象,那麼如果對象是可爲空的,在使用的時候我們就需要判斷是否爲空
if (order == null || order.customer == null || order.customer.address == null){
throw IllegalArgumentException("Invalid Order")
}
val city = order.customer.address.city
這是很常見的一種寫法,但是如果大量使用,特別是在解析JSON的時候,就會讓人覺得做了大量重複的工作,在Kotlin中,我們鼓勵用這種寫法:
val city = order?.customer?.address?.city ?: throw IllegalArgumentException("Invalid Order")
通過 ?
來判斷是否爲空,如果爲空會直接拋出異常,避免寫大量的if
和 xxx == null
使用as替代is
同樣的,我們在kotlin裏面常用的判斷還有 is
if (service !is CustomerService) {
throw IllegalArgumentException("No CustomerService")
}
service.getCustomer()
在這裏我們可以通過as
來替換
service as? CustomerService ?: throw IllegalArgumentException("No CustomerService")
service.getCustomer()
反正出發點就是減少if語句的使用,提高代碼的可讀性,順便還能減少代碼量
快速創建JSON
這個功能也是非常有用的,畢竟寫單元測試的時候需要模擬測試數據~
val customer = mapOf(
"name" to "Clair Grube",
"age" to 30,
"languages" to listOf("german", "english"),
"address" to mapOf(
"city" to "Leipzig",
"street" to "Karl-Liebknecht-Straße 1",
"zipCode" to "04107"
)
)
通過 參數名
to 參數值
這樣的形式來創建JSON,不僅僅是String,Int等常用的數據類型,包括map,list都可以創建,是不是很方便呢?
總結
在Day 6 和 Day 7 裏面我們總結了一些Kotlin的習慣用法,多加練習,掌握這些用法可以提高我們的開發效率,並且促使我們寫出好的代碼。
接下里就要進入到Java to Kotlin 的學習裏面啦,其實經過了前面Kotlin的語法,用法的學習,對於Kotlin這門語言的常用知識點都瞭解得差不多了,加油💪
Day 7 - Learn Kotlin Trip, Completed.