Kotlin的語法糖(一)基礎篇

原文地址:梁桂釗的博客git

博客地址:blog.720ui.comgithub

歡迎轉載,轉載請註明做者及出處,謝謝!面試

基本類型

局部變量與可變變量

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

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)。bash

這裏,Kotlin 中有兩種類型的相等性:結構相等、引⽤相等 。結構相等,使用 == 比較兩個變量/對象的值是否相等,使用 === 比較兩個引⽤指向同⼀對象。ui

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 提供了一個簡潔的方式,其字符串能夠包含模板表達式 , 模板表達式以 $ 開頭。spa

fun main(args: Array<String>) {
    val name = "梁桂釗"
    val blog = "http://blog.720ui.com"
    var content = "我是 $name,博客地址:$blog"
    println(content)
}
複製代碼

原生字符串

事實上,Kotlin 提供了更增強大的原生字符串,使用 """ 括起來,內部沒有轉義而且能夠包含換行和任何其餘字符。.net

fun main(args: Array<String>) {
    val code = """ val name = "梁桂釗" val blog = "http://blog.720ui.com" var content = "我是 ${'$'}name,博客地址:${'$'}blog" println(content) """
    println(code)
}
複製代碼

注意的是,原生字符串和轉義字符串內部都支持模板。 若是咱們須要在原生字符串中表示$字符,咱們須要改形成${'$'}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

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

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

相關文章
相關標籤/搜索