2.3 表示和处理选择:枚举和“when”

2.3.1 声明枚举类

声明一个简单的枚举类

enum class Color {

    RED,ORANGE,YELLOW,GREEN,BLUE,INDIGO,VIOLET

}

Kotlin用了 enum class两个关键字,而Java只有enum一个关键字。在Kotlin中,enum是一个所谓的软关键字:只有当它出现在class前面时才有特殊的意义,在其他地方可以把它当作普通的名称使用。

/**

* 声明一个带属性的枚举类

*/

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 //给枚举类定义一个方法

}
>>>
println(Color.GREEN.rgb())

当你声明每个枚举常量的时候,必须提供该常量的属性值。注意这个例子向你展示了Kotlin语法中唯一必须使用分号的地方:如果要在枚举类中定义任何方法,就要使用分号把枚举常量列表和方法定义分开。



2.3.2 使用 “when” 处理枚举类

fun selectColor(color: Color) =

when (color) { //如果颜色和枚举常量相等就返回相应的字符串

Color.RED -> "red"

Color.ORANGE -> "orange"

Color.YELLOW -> "yellow"

Color.GREEN -> "green"

Color.BLUE -> "blue"

Color.INDIGO -> "indigo"

Color.VIOLET -> "violet"

}

>>>

println(selectColor(Color.RED))

在一个when分支上合并多个选项

fun getWarmth(color: Color) =

when (color) {

Color.RED, Color.ORANGE, Color.YELLOW -> "wram"

Color.GREEN -> "neutral"

Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold"

}

2.3.3 在when结构中使用任意对象

Kotlin中的when结构比Java中的switch强大很多。switch要求必须使用常量(枚举、字符串、或者数字字面值)作为分支条件,但when可以使用任何对象

fun mix(c1: Color, c2: Color) =

when (setOf(c1, c2)) {

setOf(Color.RED, Color.YELLOW) -> Color.ORANGE

setOf(Color.YELLOW, Color.BLUE) -> Color.GREEN

setOf(Color.BLUE, Color.VIOLET) -> Color.INDIGO

else -> throw Exception("dirth color")

}

2.3.4 不带参数的‘when’

你可能也看到了在上例中效率有点低,每次调用这个函数的时候,它都会创建一些set实例,仅仅用来检查两种给定的颜色是否和另外两种颜色匹配

fun mixOptionmized(c1: Color, c2: Color) =
        when {
            (c1 == Color.RED && c2 == Color.YELLOW) ||
                    (c1 == Color.YELLOW && c2 == Color.RED) ->
                Color.ORANGE
            (c1 == Color.YELLOW && c2 == Color.GREEN) ||
                    (c1 == Color.GREEN && c2 == Color.YELLOW) ->
                Color.GREEN
            (c1 == Color.BLUE && c2 == Color.VIOLET) ||
                    (c1 == Color.VIOLET && c2 == Color.BLUE) ->
                Color.INDIGO
            else -> throw Exception("dirth color")
        }

如果没有给when表达式提供参数,分支条件就是任意的布尔表达式。mixOptionmized 和前面的mix函数一样。这种写法的有点是不会创建额外的对象,代价是它更难理解。

2.3.5 智能转换:合并类型检查和转换

open class Person(val name:String, val age:Int)
class Student(val score:Int, name: String, age: Int) : Person(name, age)

Student 是 Person的子类

fun eval(person: Person):Int{

    if(person is Person){
        val p = person as Person  // 显式地转换类型是多余的
        return p.age
    }
    if (person is Student){
        return person.score     // 变量person被智能地转换了类型
    }
    throw IllegalArgumentException("Unknown expression")
}

在Kotlin中,你要使用is检查来判断一个变量是否是某种类型。is检查和Java中的instanceOf相似。但是在Java中,使用 instanceOf之后还要显式地加上类型转换,在Kotlin中,编译器已经帮你完成这些工作了,如果你检查过一个变量是某种类型,后面就不再需要转换它。这种行为称为智能转换

参考《Kotlin实战》

猜你喜欢

转载自blog.csdn.net/cai784921129/article/details/81317789
2.3