Kotlin 枚举和 when 表达式(六)

ops/2024/9/23 6:53:12/

导读大纲

    • 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)
kotlin">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. 如果你在枚举类中定义非枚举常量的声明(比如方法或属性)
        • 分号将枚举常量与其他声明分离
kotlin">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> 如果颜色等于枚举常量, 则返回相应的字符串
kotlin">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> 还可以在同一分支中合并多个值,此时需要用逗号分隔多个值
kotlin">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> 按名称使用导入的枚举常量
kotlin">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.ppmy.cn/ops/114640.html

相关文章

利用JAVA写一张纸折叠珠穆拉玛峰高度

public class zhumulama {public static void main(String[] args) {double height 8848860;double zhi 0.1;int count 0;while(zhi < height){zhi*2;//每次折完厚度count;//计数}System.out.println("一共需要折"count"次");System.out.println(&qu…

算法题集锦go、java

1.两数之和 func twoSum(nums []int, target int) []int {hashTable : map[int]int{}for i,x : range(nums){if p,ok : hashTable[target-x];ok{return []int{p,i}}hashTable[x]i}return nil }class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,I…

计算机网络第二章(部分)

R1. 五种非专用的因特网应用及它们所使用的应用层协议: 电子邮件 (Email) - 使用 SMTP&#xff08;简单邮件传输协议&#xff09;文件传输 (File Transfer) - 使用 FTP&#xff08;文件传输协议&#xff09;网页浏览 (Web Browsing) - 使用 HTTP/HTTPS&#xff08;超文本传输协…

【iOS】——JSONModel源码

JSONModel用法 基本用法 将传入的字典转换成模型&#xff1a; 首先定义模型类&#xff1a; interface Person : JSONModel property (nonatomic, copy) NSString *name; property (nonatomic, copy) NSString *sex; property (nonatomic, assign) NSInteger age; end接…

Apifox 「定时任务」操作指南,解锁自动化测试的新利器

定时任务是按照预设时间自动执行的任务&#xff0c;它可以有效解决一些常见问题&#xff0c;比如频繁执行的回归测试和大规模的接口测试&#xff0c;这些任务需要在固定时间点或间隔周期内自动运行&#xff0c;以确保软件的持续集成和持续交付过程中的稳定性和可靠性。通过使用…

Qt_对话框QDialog的介绍

目录 1、新建项目对话框 2、非模态对话框 3、模态对话框 4、自定义对话框 5、Qt内置对话框 5.1 消息对话框QMessageBox 5.2 颜色对话框QColorDialog 5.3 文件对话框QFileDialog 5.4 字体对话框QFontDialog 5.5 输入对话框QInputDialog 结语 前言: 在Qt中&…

MySQL缓冲池详解

Buffer Pool 本文参考开源项目&#xff1a;小林coding在线文档&#xff1b; 01-缓冲池概述 ​ 在MySQL查询数据的时候&#xff0c;是通过存储引擎去磁盘做IO来获取数据库中的数据&#xff0c;这样每次查询一条数据都要去做一次或者多次磁盘的IO&#xff0c;无疑是非常慢的。…

Python爬虫之urllib模块详解

Python爬虫入门 此专栏为Python爬虫入门到进阶学习。 话不多说&#xff0c;直接开始吧。 urllib模块 Python中自带的一个基于爬虫的模块&#xff0c;其实这个模块都几乎没什么人用了&#xff0c;我就随便写写了。 - 作用&#xff1a;可以使用代码模拟浏览器发起请求。&…