切換語言為:簡體

Java轉Kotlin原來如此簡單

  • 爱糖宝
  • 2024-09-06
  • 2044
  • 0
  • 0

變數

Kotlin宣告變數的關鍵字有兩個

  • val: 不可變引用,相當於java中final修飾的變數

  • var: 可變引用

舉例:

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

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

再看下面這個例子:

val age = 20
age = “Herman”

這裏存在兩個問題導致編譯不透過:第一,由於變數會被改變,需要改成var;第二,在第一次賦值的時候編譯器推斷出age的型別應該是Int,在修改的是時候就不能被賦值String

列舉

列舉的定義需要使用關鍵字 enum class, Kotlin中的列舉和Java一樣可以擁有屬性和構造方法

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的構造方法有三個引數r,g,b,如果引數沒有傳預設是0,然後再構建物件的時候可以指定變數的名字賦值(在後麵類相關的部分會再次出現);

定義了兩個方法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只能支援列舉,數字,字串,而when支援任意型別

上面的例子還可以改寫成不帶引數的寫法,這種寫法每個分支條件就是布林表示式(類似於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中引入了區間,var oneToTen=1..10這個表示1到10的區間,這個區間是閉合的,也就是說包含10

fun testFor() {

    for (i in 1..10) {

        print("$i,")

    }

}

Java轉Kotlin原來如此簡單

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

fun testForUtil() {

    for (i in 'A' until 'F') {

        print("$i,")

    }

}

輸出結果: A,B,C,D,E,

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

fun testForDownTo() {

    for (i in 10 downTo 1 step 2) {

        print("$i,")

    }

}

Java轉Kotlin原來如此簡單


下面我們想要迭代一個List, 同時還需要訪問List的index, for迴圈改如何寫

fun testForList() {

    val list = listOf("Herman", "herman7z.site")

    for ((index, value) in list.withIndex()) {

        println("index:$index, value:$value")

    }

}

Java轉Kotlin原來如此簡單

迭代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還可以用來判斷元素在集合和區間是否存在,println(1 in 1..10)

異常處理

在Java中需要區分受檢異常和不受檢異常, 比如IO操作的方法透過都會丟擲IOException, 應用程式必須要處理,這導致了很多模式程式碼, 所以在Kotlin中不在區分受檢異常和不受檢異常,無需在方法後面trhow 異常.

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

fun testTryCatch() {

    val result = try {

        val i = 5 / 0;

    } catch (e: Exception) {

        0;

    }

    println(result)

}

上面的程式碼執行時遇到了異常進入到了catch分支, 最後一行是0, 所以result的結果就是0

字串

在Java中我們想要使用字串模版是透過String.format來實現,接下來看Kotlin如何的字串模版

val name = "Herman"

println("Hello, $name")

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

val age = 10;

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

在Java中的String.split方法的引數是正規表示式,所以在執行特殊的分隔符時主要轉義, Kotlin過載了這個方法

println("123.abc".split(".")) //這裏的. 作爲了普通字串

輸出的結果

[1231, 12312]

當我們需要使用正規表示式來分割是可以透過一下方式呼叫

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

這裏使用了雙斜槓轉義操作, 也可以是三重引號來去掉轉義,看起來會更加直接

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

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.