当前位置: 首页 > news >正文

Kotlin 枚举和 when 表达式(六)

导读大纲

    • 1.1 表示和处理选择: Enums和when
      • 1.1.1 声明枚举类和枚举常量
      • 1.1.2 使用 when 表达式处理枚举类

1.1 表示和处理选择: Enums和when

  1. 在本节中,我们将以在 Kotlin 中声明枚举为例,介绍 when 结构
    • when可以被视为比 Java 中 switch 结构更强大、更常用的替代品

1.1.1 声明枚举类和枚举常量

  1. 在这里,你必须用 Kotlin 代码来实现它们,特别是颜色常量枚举
    • 这是 Kotlin 比相应 Java 使用更多关键字的罕见情况
      1. kotlin中的枚举类(enum class)与 Java 中的枚举(enum)
package colors
enum class Color {RED,ORANGE,YELLOW,GREEN,BLUE,INDIGO,VIOLET
}
  1. 在 Kotlin 中,enum 是一个所谓的软关键字

    • 当它出现在 class 之前时,它就有特殊的含义
      1. 但你也可以在其他地方将它用作常规名称(例如函数、变量名或参数)
    • 另一方面,class 是一个硬关键字,这意味着不能将它用作标识符
      1. 必须使用另一种拼写或措辞,如 clazz 或 aClass
  2. 将颜色存储在枚举中很有用,但我们可以做得更好

    • 颜色值通常使用红、绿、蓝三原色来表示
    • 枚举常量使用相同的构造函数和属性声明语法
      1. 就像你在前面看到的普通类一样
    • 您可以利用这一点来扩展Color枚举
      1. 您可以将每个枚举常量与其 r、g 和 b 值关联起来
      2. 您还可以使用熟悉的语法声明属性(如 rgb)和方法(如printColor)
  3. 示例–带有属性值的枚举类

    • <1> 声明枚举常量的属性
    • <2> 在创建每个常量时指定属性值
    • <3> 这里的分号是必需
    • <4> 定义枚举类的属性
    • <5> 定义枚举类的方法
      1. 这里又是表达式体形式的函数, 符合Kotlin本土化
    • 请注意,这个例子展示 Kotlin 语法中唯一需要使用分号的地方
      1. 如果你在枚举类中定义非枚举常量的声明(比如方法或属性)
        • 分号将枚举常量与其他声明分离
enum class Color(val r: Int,                     // <1>val g: Int,val b: Int,
) {RED(255, 0, 0),                 // <2>ORANGE(255, 165, 0),YELLOW(255, 255, 0),GREEN(0, 255, 0),BLUE(0, 0, 255),INDIGO(75, 0, 130),VIOLET(238, 130, 238);         // <3>val rgb = (r * 256 + g) * 256 + b              // <4>fun printColor() = println("$this is $rgb")    // <5>
}
fun main() {println(Color.BLUE.rgb)// 255Color.GREEN.printColor()// GREEN is 65280
}

1.1.2 使用 when 表达式处理枚举类

  1. 在 Java 中,您可以使用 switch 语句

    • 或者从 Java 13开始使用 switch 表达式
    • 相应的 Kotlin 结构when 表达式
  2. 和 if 一样,"when"也是一个返回值的表达式

    • <1> 直接返回when表达式,这就是表达式体函数的语言魅力
      1. 使用块体,最起码的大括号和返回语句是少不了的
    • <2> 如果颜色等于枚举常量, 则返回相应的字符串
fun getMnemonic(color: Color) =         // <1>when (color) {                      // <2>Color.RED -> "Richard"Color.ORANGE -> "Of"Color.YELLOW -> "York"Color.GREEN -> "Gave"Color.BLUE -> "Battle"Color.INDIGO -> "In"Color.VIOLET -> "Vain"}
fun main() {println(getMnemonic(Color.BLUE))// Battle
}
  1. 代码会找到与传递的颜色值相对应的分支
    • 请注意,您不需要为每个分支编写 break 语句
      1. 在 Java 中,在 switch 语句中缺少 break 语句往往会导致错误
    • 如果匹配成功,则只执行相应的分支
    • <1> 还可以在同一分支中合并多个值,此时需要用逗号分隔多个值
fun measureColor() = Color.ORANGE
// as a stand-in for more complex measurement logic
fun getWarmthFromSensor(): String {val color = measureColor()return when(color) {// <1>Color.RED, Color.ORANGE, Color.YELLOW -> "warm (red = ${color.r})"Color.GREEN -> "neutral (green = ${color.g})"Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold (blue = ${color.b})"}
}
fun main() {println(getWarmthFromSensor())// warm (red = 255)
}
  1. 通过使用"Color.*"来导入所有的常量值,可以简化代码并减少重复
    • 避免每次引用枚举常量都指定 Color 枚举类名
    • <1> 导入所有枚举常量,以便按名称使用它们
    • <2> 按名称使用导入的枚举常量
import  colors.Color.*                                    // <1>
fun measureColor() = ORANGE
// as a stand-in for more complex measurement logic
fun getWarmthFromSensor(): String {val color = measureColor()return when(color) {RED, ORANGE, YELLOW -> "warm (red = ${color.r})"   // <2>GREEN -> "neutral (green = ${color.g})"            BLUE, INDIGO, VIOLET -> "cold (blue = ${color.b})" // <2>}
}
http://www.lryc.cn/news/444107.html

相关文章:

  • 数字范围按位与
  • WebRTC编译后替换libwebrtc.aar时提示找不到libjingle_peerconnection_so.so库
  • Nature Electronics |无感佩戴的纤维基电子皮肤(柔性半导体器件/柔性健康监测/电子皮肤/柔性传感/纤维器件)
  • 深入剖析Docker容器安全:挑战与应对策略
  • 后端技术打怪升级之路
  • Leetcode 3296. Minimum Number of Seconds to Make Mountain Height Zero
  • 计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)
  • 测试面试题:接口自动化测试流程?
  • Golang面试题
  • 《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)
  • 计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档
  • 【数据结构与算法】LeetCode:二分查找
  • 专题·大模型安全 | 生成式人工智能的内容安全风险与应对策略
  • CORS跨域+Nginx配置、Apache配置
  • 文件查找和打包压缩【1.7】
  • 速盾:cdn一般多长时间清理下缓存?
  • react hooks--useRef
  • GPT对话知识库——将寄存器中的一位数据读到变量中需要什么步骤?C语言中掩码的作用。
  • 【计算机网络】运输层协议解析
  • Redis存储原理
  • PHP、Java等其他语言转Go时选择GoFly快速快速开发框架指南
  • 【MySQL】获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法
  • WebView2新增、修改、删除、禁用右键菜单相关操作。
  • 使用vue创建项目
  • Apache CVE-2021-41773 漏洞攻略
  • 【redis-02】深入理解redis中RBD和AOF的持久化
  • 亚马逊IP关联揭秘:发生ip关联如何处理
  • jQuery Mobile 弹窗
  • 【macOS】【zsh报错】zsh: command not found: python
  • NoSql数据库Redis知识点