一、枚舉
聲明一個(gè)枚舉類(lèi)俊扳,enum是一個(gè)所謂的軟關(guān)鍵字途蒋,只有出現(xiàn)在class之前才有特殊意義,否則就是一個(gè)普通的名字馋记。
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
可以給枚舉類(lèi)聲明屬性和方法
enum class Color(val r: Int, val g: Int, val b: Int) {
RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0),
GREEN(0, 255, 0), BLUE(0, 0, 255), INDIGO(75, 0, 130),
VIOLET(238, 130, 238);//如果枚舉還有函數(shù)則用“号坡;”,如果沒(méi)有用“}”即可
fun rgb() = (r * 256 + g) * 256 + b
}
備注:Kotlin唯一用分號(hào)的地方梯醒。如果枚舉中定義了函數(shù)宽堆,就要用分號(hào)隔開(kāi)。如果沒(méi)有函數(shù)不用分號(hào)茸习。
二畜隶、When
2.1 使用when處理枚舉類(lèi)
kotlin中when語(yǔ)句類(lèi)似java中的switch語(yǔ)句。when和if一樣号胚,也是有返回值的表達(dá)式籽慢。
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
fun main() {
val color = Color.RED
val result = when(color){
Color.RED -> "RED"
Color.ORANGE -> "ORANGE"
Color.YELLOW -> "YELLOW"
Color.GREEN -> "GREEN"
Color.BLUE -> "BLUE"
Color.INDIGO -> "INDIGO"
Color.VIOLET -> "VIOLET"
}
println("when result = $result")//執(zhí)行結(jié)果“when result = RED”
}
和java的switch不同的是,不需要在分支里寫(xiě)break語(yǔ)句猫胁,且when語(yǔ)句可以使用任何對(duì)象箱亿。
2.2 when語(yǔ)句中使用任何對(duì)象
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
fun main() {
val c1 = Color.YELLOW
val c2 = Color.RED
val result = when (setOf<Color>(c1, c2)) {
setOf(Color.RED, Color.YELLOW) -> "ORANGE"
setOf(Color.YELLOW, Color.BLUE) -> "GREEN"
setOf(Color.BLUE, Color.VIOLET) -> "INDIGO"
else -> "NA"http://必須寫(xiě)else分支
}
println("when result : $result")//執(zhí)行結(jié)果“when result : ORANGE”
}
Kotlin標(biāo)函數(shù)庫(kù)中有一個(gè)setOf函數(shù)創(chuàng)建一個(gè)Set,Set條目順序并不重要弃秆,只要條目包含一樣就相等届惋。
2.3 不帶參數(shù)的wen語(yǔ)句
上面帶參數(shù)的when語(yǔ)句其實(shí)性能很差,每個(gè)分支都要?jiǎng)?chuàng)建set對(duì)象菠赚,可以用不帶參數(shù)的when語(yǔ)句優(yōu)化
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
fun main() {
val c1 = Color.YELLOW
val c2 = Color.RED
val result = when {
(c1 == Color.RED && c2 == Color.YELLOW)
|| (c1 == Color.YELLOW && c2 == Color.RED) -> "ORANGE"
(c1 == Color.YELLOW && c2 == Color.BLUE)
|| (c1 == Color.BLUE && c2 == Color.YELLOW) -> "ORANGE"
(c1 == Color.BLUE && c2 == Color.VIOLET)
|| (c1 == Color.VIOLET && c2 == Color.BLUE) -> "ORANGE"
else -> "NA"
}
println("no args when result : $result")//執(zhí)行結(jié)果“no args when result : ORANGE”
}
2.4 合并類(lèi)型檢查和轉(zhuǎn)換
Kotlin中"is"相當(dāng)于Java中的instanceOf盼樟,Kotlin中as相當(dāng)于Java中的強(qiáng)轉(zhuǎn)。Kotlin不同Java的是不需要強(qiáng)轉(zhuǎn)锈至,編譯器會(huì)幫我們完成晨缴。如果你已經(jīng)檢查了一個(gè)變量是某種類(lèi)型,后面就不需要類(lèi)型轉(zhuǎn)換了峡捡,我們把這種行為稱(chēng)為智能轉(zhuǎn)換
interface Animal
class Cat(var color: String) : Animal
class Dog(var name: String, var age: Int) : Animal
fun test(animal: Animal) {
if (animal is Cat) {
val cat = animal as Cat//顯示的強(qiáng)轉(zhuǎn)
println(cat.color)
}
else if (animal is Dog)
println(animal.age)//智能的轉(zhuǎn)換
else println("NA")
}
fun main() {
test(Cat("RED"))//執(zhí)行結(jié)果“RED”
}