Java轉(zhuǎn)Kotlin原來如此簡單

程序員常用的IDEA插件:https://github.com/silently9527/Toolkit

變量

Kotlin聲明變量的關(guān)鍵字有兩個

  • val: 不可變引用,相當(dāng)于java中final修飾的變量
  • var: 可變引用

舉例:

val name:String = "Herman";
val age = 20;

在這個例子中,變量name明確指定了類型是String,變量age沒有指定類型,這兩種方式都正確,Kotlin的編譯器可以根據(jù)初始化的值推斷出age的類型,所以在定義變量的時候可以不用指定變量的類型

再看下面這個例子:

val age = 20
age = “Herman”

這里存在兩個問題導(dǎo)致編譯不通過:第一,由于變量會被改變,需要改成var;第二,在第一次賦值的時候編譯器推斷出age的類型應(yīng)該是Int,在修改的是時候就不能被賦值String

枚舉

枚舉的定義需要使用關(guān)鍵字 enum class, Kotlin中的枚舉和Java一樣可以擁有屬性和構(gòu)造方法

enum class Color(val r: Int = 0, val g: Int = 0, val b: Int = 0) {
    RED(255, 0, 0), GREEN(g = 255), BLUE(b = 255);

    fun sum() = r + g + b

    fun sum2(): Int {
        return r + g + b
    }
}

這里的枚舉Color的構(gòu)造方法有三個參數(shù)r,g,b,如果參數(shù)沒有傳默認是0,然后再構(gòu)建對象的時候可以指定變量的名字賦值(在后面類相關(guān)的部分會再次出現(xiàn));

定義了兩個方法sum,兩種寫法都支持

when

when語句類似于Java中的switch語句,但用法會更多一些

fun getWarmth(color: Color) =
    when (color) {
        Color.RED, Color.GREEN -> "warm"
        Color.BLUE -> "cold"
    }
println(getWarmth(Color.BLUE))

與java中的switch只能支持枚舉,數(shù)字,字符串,而when支持任意類型

上面的例子還可以改寫成不帶參數(shù)的寫法,這種寫法每個分支條件就是布爾表達式(類似于java中的if-elseif)

fun getWarmth(color: Color) =
    when {
        color == Color.RED || color == Color.GREEN -> "warm"
        color == Color.BLUE -> "cold"
        else -> throw IllegalArgumentException()
    }

迭代

while的用法和Java相同

while(condition){

}

do{

}while(condition)

在Kotlin中引入了區(qū)間,var oneToTen=1..10這個表示1到10的區(qū)間,這個區(qū)間是閉合的,也就是說包含10

fun testFor() {
    for (i in 1..10) {
        print("$i,")
    }
}

由于區(qū)間是閉合的, 包含了10, 在實際情況下我們更常用是不包含, 可以使用until

fun testForUtil() {
    for (i in 'A' until 'F') {
        print("$i,")
    }
}

輸出結(jié)果: A,B,C,D,E,

上面的例子如果我們可以想要倒序輸出,步長2,可以是使用 downTo, step實現(xiàn)

fun testForDownTo() {
    for (i in 10 downTo 1 step 2) {
        print("$i,")
    }
}

下面我們想要迭代一個List, 同時還需要訪問List的index, for循環(huán)改如何寫

fun testForList() {
    val list = listOf("Herman", "herman7z.site")
    for ((index, value) in list.withIndex()) {
        println("index:$index, value:$value")
    }
}

迭代map, 同時訪問key,value

fun testForMap() {
    val map = TreeMap<Char, Int>();
    for (i in 'A' until 'F') {
        map[i] = i.code;
    }

    for ((key, value) in map) {
        println("key:$key, value:$value")
    }
}

in還可以用來判斷元素在集合和區(qū)間是否存在,println(1 in 1..10)

異常處理

在Java中需要區(qū)分受檢異常和不受檢異常, 比如IO操作的方法通過都會拋出IOException, 應(yīng)用程序必須要處理,這導(dǎo)致了很多模式代碼, 所以在Kotlin中不在區(qū)分受檢異常和不受檢異常,無需在方法后面trhow 異常.

另外try-catch語句依然可以像if-else語句一樣作為一個表達式, 最后一行就是表達式的返回值

fun testTryCatch() {
    val result = try {
        val i = 5 / 0;
    } catch (e: Exception) {
        0;
    }

    println(result)
}

上面的代碼運行時遇到了異常進入到了catch分支, 最后一行是0, 所以result的結(jié)果就是0

字符串

在Java中我們想要使用字符串模版是通過String.format來實現(xiàn),接下來看Kotlin如何的字符串模版

val name = "Herman"
println("Hello, $name")

從上面的我們可以看出Kotlin的模版確實要更簡潔,直接使用$來引用變量,如果想要在模版中輸出字符,需要使用轉(zhuǎn)義:`\`; 不僅如此,在模版中來可以寫入一下邏輯判斷

val age = 10;
println("Hello, ${if(age>20) "Herman" else "Kotlin"}")

在Java中的String.split方法的參數(shù)是正則表達式,所以在執(zhí)行特殊的分隔符時主要轉(zhuǎn)義, Kotlin重載了這個方法

println("123.abc".split(".")) //這里的. 作為了普通字符串

輸出的結(jié)果

[1231, 12312]

當(dāng)我們需要使用正則表達式來分割是可以通過一下方式調(diào)用

println("123.abc".split("\\.".toRegex()))

這里使用了雙斜杠轉(zhuǎn)義操作, 也可以是三重引號來去掉轉(zhuǎn)義,看起來會更加直接

println("123.abc".split("""\.""".toRegex()))

原文鏈接: http://herman7z.site

最后(看完不點關(guān)注,你們想白嫖我嗎)

文中或許會存在或多或少的不足、錯誤之處,有建議或者意見也非常歡迎大家在評論交流。

最后,寫作不易,請不要白嫖我喲,希望朋友們可以點贊評論關(guān)注三連,因為這些就是我分享的全部動力來源??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容