三、Kotlin学习之枚举和When

一、枚举

声明一个枚举类,enum是一个所谓的软关键字,只有出现在class之前才有特殊意义,否则就是一个普通的名字。

enum class Color {
    RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

可以给枚举类声明属性和方法

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);//如果枚举还有函数则用“;”,如果没有用“}”即可

    fun rgb() = (r * 256 + g) * 256 + b
}

备注:Kotlin唯一用分号的地方。如果枚举中定义了函数,就要用分号隔开。如果没有函数不用分号。

二、When

2.1 使用when处理枚举类

kotlin中when语句类似java中的switch语句。when和if一样,也是有返回值的表达式。

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")//执行结果“when result = RED”
}

和java的switch不同的是,不需要在分支里写break语句,且when语句可以使用任何对象。

2.2 when语句中使用任何对象

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"//必须写else分支
    }

    println("when result : $result")//执行结果“when result : ORANGE”
}

Kotlin标函数库中有一个setOf函数创建一个Set,Set条目顺序并不重要,只要条目包含一样就相等。

当使用when结构来执行表达式时候,Kotlin编译器会强制检查默认选项。所以when作为非表达式,分支可以没有else分支。但是when作为表达式时,必须提供else分支

interface Animal
class Cat : Animal
class Dog : Animal

fun test(color: Animal) {
    when (color) {
        is Cat -> "cat"
        is Dog -> "dog"
//    else -> "else"//when作为函数体而非表达式,不需要else
    }
}
interface Animal
class Cat : Animal
class Dog : Animal

fun test(color: Animal) =
    when (color) {
        is Cat -> "cat"
        is Dog -> "dog"
        else -> "else"//when作为函数返回时,必须需要else
    }

2.3 不带参数的wen语句

上面带参数的when语句其实性能很差,每个分支都要创建set对象,可以用不带参数的when语句优化

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")//执行结果“no args when result : ORANGE”
}

2.4 合并类型检查和转换

Kotlin中"is"相当于Java中的instanceOf,Kotlin中as相当于Java中的强转。Kotlin不同Java的是不需要强转,编译器会帮我们完成。如果你已经检查了一个变量是某种类型,后面就不需要类型转换了,我们把这种行为称为智能转换

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//显示的强转
        println(cat.color)
    }
    else if (animal is Dog)
        println(animal.age)//智能的转换
    else println("NA")
}

fun main() {
    test(Cat("RED"))//执行结果“RED”
}

你可能感兴趣的:(Kotlin)