Kotlin學習之旅(D7)-Kotlin Idioms part 2

Kotlin學習之旅第七天

今天的主題是:Kotlin中的習慣用法-第二部分

前言

Kotlin學習之旅(D1)-學習計劃&基本語法

Kotlin學習之旅(D2)-基本語法

Kotlin學習之旅(D3)-類與繼承

Kotlin學習之旅(D4)-函數與Lambda表達式

Kotlin學習之旅(D5)-高級語法

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")

通過 ? 來判斷是否爲空,如果爲空會直接拋出異常,避免寫大量的ifxxx == 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.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章