Kotlin的語法糖(一)基礎篇

樑桂釗發表於2019-03-02

原文地址:樑桂釗的部落格

部落格地址:blog.720ui.com

歡迎轉載,轉載請註明作者及出處,謝謝!

基本型別

區域性變數與可變變數

Java 提供了八種基本型別:byte、short、int、long、float、double、boolean、char。對比下 Kotlin,它的資料型別分為:數字、字元、布林、陣列、字串。數字型別包括 Byte、Short、Int、Long、Float、Double 等。注意的是,在 Kotlin 中對於數字沒有隱式型別自動轉換,換句話說,較⼩的型別不能隱式轉換為較⼤的型別。Kotlin 中字元⽤ Char 型別表⽰,布林⽤ Boolean 型別表⽰,字串⽤ String 型別表⽰。

Kotlin 有 val 和 var 兩個關鍵字。 val 定義一個只讀變數,var 定義一個可變變數,注意的是,Kotlin 支援⾃動推斷出型別。

fun main(args: Array<String>) {
    val x: Int = 21
    var y: Int = 11
    val z = 21 // ⾃動推斷
}
複製程式碼

同一性與相等性

在 Java 中,我們一般使用 equals() 比較兩個變數的值是否相等。讀者是否記得那道經典的面試題:說說 equals 與 == 的區別。事實上,這是⼀個⻓期困擾我們的問題,一不小心可能就掉坑了。我們再來理解下,==:比較兩個變數的值是否相等(通常情況下,用來比較兩個基本資料型別的值)。equals:比較的是兩個物件的內容是否相同(通常情況下要重寫equal)。

這裡,Kotlin 中有兩種型別的相等性:結構相等、引⽤相等 。結構相等,使用 == 比較兩個變數/物件的值是否相等,使用 === 比較兩個引⽤指向同⼀物件。

fun main(args: Array<String>) {
    val x = "樑桂釗"
    val y = "樑桂釗"
    println(x == y)     // true
    println(x === y)    // true

    val a = 1
    var b = 1
    println(a == b)     // true
    println(a === b)    // true
}
複製程式碼

字串模板

在 Java 中,我們拼接含有變數的字串非常麻煩,而 Kotlin 提供了一個簡潔的方式,其字串可以包含模板表示式 , 模板表示式以 $ 開頭。

fun main(args: Array<String>) {
    val name = "樑桂釗"
    val blog = "http://blog.720ui.com"
    var content = "我是 $name,部落格地址:$blog"
    println(content)
}
複製程式碼

原生字串

事實上,Kotlin 提供了更加強大的原生字串,使用 """ 括起來,內部沒有轉義並且可以包含換行和任何其他字元。

fun main(args: Array<String>) {
    val code = """
            val name = "樑桂釗"
            val blog = "http://blog.720ui.com"
            var content = "我是 ${'$'}name,部落格地址:${'$'}blog"
            println(content)
        """
    println(code)
}
複製程式碼

注意的是,原生字串和轉義字串內部都支援模板。 如果我們需要在原生字串中表示$字元,我們需要改造成${'$'}

陣列是不型變

陣列在 Kotlin 中使⽤ Array 類來表⽰,與 Java 不同的是, Kotlin 中陣列是不型變的 。

可空值與 null 檢測

在 Java 中, 我們經常遇到 NullPointerException ( NPE )異常,Kotlin 的型別系統幫助我們消除來自程式碼空引用的危險。當某個變數的值可以為 null 的時候, 必須在宣告處的型別後新增? 來標識該引⽤可為空。

val blog: String? = "blog.720ui.com"
複製程式碼

這裡,我們可以顯式檢查 blog 是否為 null。

if(blog != null){
    println(blog.length)
}
複製程式碼

如果沒有這種顯式檢查,直接輸出 blog.length 是不允許的(Kotlin 幫助我們做了一些檢查工作)。因此,如果我們認為它一定存在值,這樣改造成 blog!! 。注意的是,如果 blog 為空,就會丟擲一個 NPE 異常。

blog!!.length
複製程式碼

還有一種選擇,我們可以寫作 ?.,如果 blog 非空,就返回 blog.length ,否則返回 null。

blog?.length
複製程式碼

此外,Kotlin 還支援鏈式呼叫,如果任意一個屬性為空,這個鏈式呼叫就會返回 null。

因此,通過這個特性,可以讓我們的程式碼變得非常簡潔。

name?.size
name?.size ?: "empty"
name.getName() ?: throw IllegalArgumentException("name expected")
複製程式碼

控制流

if 表示式

在 Kotlin 中, if 可以被當做語句使用。

val max = if (a > b) a else b
複製程式碼

if 的分支也可以是程式碼塊,最後的表示式作為該塊的值。

val max = if (a > b) {
	print("Choose a")
	a
} else {
	print("Choose b")
	b
}
複製程式碼

When 表示式

Java 語言中,我們使用 switch 操作符,但是必須使用常量(列舉常量、字串、數字)作為分支。而 Kotlin 中, 使用 When 表示式,並且其允許使用任何型別。事實上,When 表示式非常靈活,可以被當做表示式,也可以被當做語句使用。此外,很多分支需要用相同的方式處理,可以支援任意表示式作為分支條件,可以檢測一個值是否在一個區間或者集合中。

fun main(args: Array<String>) {
    val x = 1
    when (x) {
        0 -> print("x == 0")
        1,2 -> print("x == 2")
        in 3..10 -> print("x in 3..10")
        is Any -> print("is Any")
        else -> {
            print("不匹配")
        }
    }
}
複製程式碼

注意的是,與 Java 不同的是,我們不需要在每個分支上寫 break 語句,如果其匹配成功,只有對應的分支會執行。

解構宣告

在 Kotlin 中,可以把⼀個物件解構成很多變數。

val (name, age) = person
for ((key, value) in map) {}
複製程式碼

參考資料

原始碼

相關示例完整程式碼: spring-kotlin-samples

(完,轉載請註明作者及出處。)

更多精彩文章,盡在「服務端思維」!

Kotlin的語法糖(一)基礎篇

相關文章