變數
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,") } }
由於區間是閉合的, 包含了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,") } }
下面我們想要迭代一個List, 同時還需要訪問List的index, for迴圈改如何寫
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
還可以用來判斷元素在集合和區間是否存在,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()))