美文网首页
三、Kotlin学习之枚举和When

三、Kotlin学习之枚举和When

作者: 家有萌犬 | 来源:发表于2020-03-21 22:46 被阅读0次

一、枚举

声明一个枚举类,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条目顺序并不重要,只要条目包含一样就相等。

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学习目录

    Kotlin学习目录 一、Kotlin学习之函数和变量二、Kotlin学习之类和属性三、Kotlin学习之枚举和W...

  • 三、Kotlin学习之枚举和When

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

  • Kotlin 枚举和 when

    前言 在接下来这章中,我们将会讨论 Kotlin 中的枚举和 when 结构。 枚举类 在 Java 中,声明一个...

  • Kotlin 学习笔记(二) if、when、is 、枚举 和

    前言本文章只是用于记录学习,所以部分地方如果有错误或者理解不对的地方,麻烦请指正。本篇为 csdn 原文章 转移修...

  • Kotlin语法小总结

    序 在看《Kotlin实战》时对一些点的总结和记录 1、三元表达式 2、枚举类 Java: 3、when (1)用...

  • kotlin 中的枚举类和 “when”

    文章目录场景枚举类when总结 场景 java 中的枚举类还有 switch 结构跟 kotlin 中的有什么不同...

  • Kotlin之枚举和''when'

    声明枚举类 声明简单的枚举 声明带属性的枚举,在每个常量创建的时候指定属性值 使用"when"处理枚举类 when...

  • [Kotlin Tutorials 5] 枚举和Sealed C

    枚举和Sealed Class 枚举 首先, Kotlin和Java一样, 也是有枚举类型的: 枚举类型还可以实现...

  • Kotlin学习之基础语法

    写在前面的:1,Kotlin学习之基础语法2,Kotlin学习之类和继承3,Kotlin学习之属性和字段4,Kot...

  • Kotlin入门笔记八:Lambda和序列

    Kotlin入门笔记一:方法、变量、类 Kotlin入门笔记二:when、for、in Kotlin入门笔记三:可...

网友评论

      本文标题:三、Kotlin学习之枚举和When

      本文链接:https://www.haomeiwen.com/subject/kaspyhtx.html