程序員常用的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ù)沒有傳默認(rèn)是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ù)的寫法司澎,這種寫法每個分支條件就是布爾表達(dá)式(類似于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語句一樣作為一個表達(dá)式, 最后一行就是表達(dá)式的返回值
fun testTryCatch() {
val result = try {
val i = 5 / 0;
} catch (e: Exception) {
0;
}
println(result)
}
上面的代碼運行時遇到了異常進(jìn)入到了catch分支, 最后一行是0, 所以result的結(jié)果就是0
字符串
在Java中我們想要使用字符串模版是通過String.format來實現(xiàn),接下來看Kotlin如何的字符串模版
val name = "Herman"
println("Hello, $name")
從上面的我們可以看出Kotlin的模版確實要更簡潔栋豫,直接使用$
來引用變量挤安,如果想要在模版中輸出`; 不僅如此丧鸯,在模版中來可以寫入一下邏輯判斷
val age = 10;
println("Hello, ${if(age>20) "Herman" else "Kotlin"}")
在Java中的String.split
方法的參數(shù)是正則表達(dá)式,所以在執(zhí)行特殊的分隔符時主要轉(zhuǎn)義, Kotlin重載了這個方法
println("123.abc".split(".")) //這里的. 作為了普通字符串
輸出的結(jié)果
[1231, 12312]
當(dāng)我們需要使用正則表達(dá)式來分割是可以通過一下方式調(diào)用
println("123.abc".split("\\.".toRegex()))
這里使用了雙斜杠轉(zhuǎn)義操作, 也可以是三重引號來去掉轉(zhuǎn)義,看起來會更加直接
println("123.abc".split("""\.""".toRegex()))
原文鏈接: http://herman7z.site
最后(看完不點關(guān)注蛤铜,你們想白嫖我嗎)
文中或許會存在或多或少的不足、錯誤之處丛肢,有建議或者意見也非常歡迎大家在評論交流围肥。
最后,寫作不易蜂怎,請不要白嫖我喲穆刻,希望朋友們可以點贊評論關(guān)注三連,因為這些就是我分享的全部動力來源??