Kotlin 枚举和 when 表达式(六)
导读大纲
- 1.1 表示和处理选择: Enums和when
- 1.1.1 声明枚举类和枚举常量
- 1.1.2 使用 when 表达式处理枚举类
1.1 表示和处理选择: Enums和when
- 在本节中,我们将以在 Kotlin 中声明枚举为例,介绍 when 结构
- when可以被视为比 Java 中 switch 结构更强大、更常用的替代品
1.1.1 声明枚举类和枚举常量
- 在这里,你必须用 Kotlin 代码来实现它们,特别是颜色常量枚举
- 这是 Kotlin 比相应 Java 使用更多关键字的罕见情况
- kotlin中的
枚举类(enum class)
与 Java 中的枚举(enum)
- kotlin中的
- 这是 Kotlin 比相应 Java 使用更多关键字的罕见情况
package colors
enum class Color {RED,ORANGE,YELLOW,GREEN,BLUE,INDIGO,VIOLET
}
-
在 Kotlin 中,enum 是一个所谓的软关键字
- 当它出现在 class 之前时,它就有特殊的含义
- 但你也可以在其他地方将它用作常规名称(例如函数、变量名或参数)
- 另一方面,class 是一个硬关键字,这意味着不能将它用作标识符
- 必须使用另一种拼写或措辞,如 clazz 或 aClass
- 当它出现在 class 之前时,它就有特殊的含义
-
将颜色存储在枚举中很有用,但我们可以做得更好
- 颜色值通常使用红、绿、蓝三原色来表示
- 枚举常量使用相同的构造函数和属性声明语法
- 就像你在前面看到的普通类一样
- 您可以利用这一点来扩展Color枚举
- 您可以将每个枚举常量与其 r、g 和 b 值关联起来
- 您还可以使用熟悉的语法声明属性(如 rgb)和方法(如printColor)
-
示例–带有属性值的枚举类
- <1> 声明枚举常量的属性
- <2> 在创建每个常量时指定属性值
- <3> 这里的分号是必需的
- <4> 定义枚举类的属性
- <5> 定义枚举类的方法
- 这里又是表达式体形式的函数, 符合Kotlin本土化
- 请注意,这个例子展示 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 表达式处理枚举类
-
在 Java 中,您可以使用 switch 语句
- 或者从 Java 13开始使用 switch 表达式
- 相应的 Kotlin 结构是 when 表达式
-
和 if 一样,"when"也是一个返回值的表达式
- <1> 直接返回when表达式,这就是表达式体函数的语言魅力
- 使用块体,最起码的大括号和返回语句是少不了的
- <2> 如果颜色等于枚举常量, 则返回相应的字符串
- <1> 直接返回when表达式,这就是表达式体函数的语言魅力
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
}
- 代码会找到与传递的颜色值相对应的分支
- 请注意,您不需要为每个分支编写 break 语句
- 在 Java 中,在 switch 语句中缺少 break 语句往往会导致错误
- 如果匹配成功,则只执行相应的分支
- <1> 还可以在同一分支中合并多个值,此时需要用逗号分隔多个值
- 请注意,您不需要为每个分支编写 break 语句
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)
}
- 通过使用"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>}
}
相关文章:
Kotlin 枚举和 when 表达式(六)
导读大纲 1.1 表示和处理选择: Enums和when1.1.1 声明枚举类和枚举常量1.1.2 使用 when 表达式处理枚举类 1.1 表示和处理选择: Enums和when 在本节中,我们将以在 Kotlin 中声明枚举为例,介绍 when 结构 when可以被视为比 Java 中 switch 结构更强大、更常用的替代品 1.1.1 …...

数字范围按位与
优质博文:IT-BLOG-CN 题目 给你两个整数left和right,表示区间[left, right],返回此区间内所有数字 按位与 的结果(包含left、right端点)。 示例 1: 输入:left 5, right 7 输出:…...

WebRTC编译后替换libwebrtc.aar时提示找不到libjingle_peerconnection_so.so库
Loading native library: jingle_peerconnection_so 问题原因:编译的时候只编译了armeabi-v7a的版本,但是应用程序是arm64-v8a,所以无法运行 解决方法:更新编译脚本,加上arm64-v8a进行编译 ./tools_webrtc/android/bu…...

Nature Electronics |无感佩戴的纤维基电子皮肤(柔性半导体器件/柔性健康监测/电子皮肤/柔性传感/纤维器件)
英国剑桥大学Yan Yan Shery Huang课题组,在《Nature Electronics 》上发布了一篇题为“Imperceptible augmentation of living systems with organic bioelectronic fibres”的论文,第一作者为王文宇博士(Wenyu Wang),论文内容如下: 一、 摘要 利用电子技术对人类皮肤和…...

深入剖析Docker容器安全:挑战与应对策略
随着容器技术的广泛应用,Docker已成为现代应用开发和部署的核心工具。它通过轻量级虚拟化技术实现应用的隔离与封装,提高了资源利用率。然而,随着Docker的流行,其安全问题也成为关注焦点。容器化技术虽然提供了良好的资源隔离&…...

后端技术打怪升级之路
记录后端技术打怪升级之路,如下是个人总记的主要技术栈,仅供参考! 备注: 同名文章一同步发表于个人网站及微信公众号 个人网站 工藤新一的技术小窝...
Leetcode 3296. Minimum Number of Seconds to Make Mountain Height Zero
Leetcode 3296. Minimum Number of Seconds to Make Mountain Height Zero 1. 解题思路2. 代码实现 题目链接:3296. Minimum Number of Seconds to Make Mountain Height Zero 1. 解题思路 这一题的思路的话我们采用的是一个二分法的思路,找到一个最大…...

计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
测试面试题:接口自动化测试流程?
1、测试用例编写:根据接口的需求和功能,编写相应的测试用例。测试用例应包括正常、边界和异常等各种情况下的测试。 2、准备测试数据:根据测试用例的要求,准备相应的测试数据。数据可以通过手动输入、数据库查询、文件导入等方式进…...
Golang面试题
在Golang(也称为Go语言)工程师的面试中,可能会遇到各种技术性和概念性的问题。 一、基础部分 Golang 中 make 和 new 的区别? 共同点:两者都用于分配内存。不同点: make 专为 slice、map 和 channel 设计,返回初始化后的(非零)值。new 分配内存并返回指向该内存的指针…...

《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)
目录 一、最终实现后,效果如下。 (1)简单介绍本游戏项目(待完善) (2)运行效果图(具体大家自己可以试) 初始运行情况。 手动更换背景图。 通过子弹攻击敌机,累…...

计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

【数据结构与算法】LeetCode:二分查找
文章目录 二分查找二分查找搜索插入位置 (Hot 100)x 的平方根搜索二维矩阵(Hot 100)在排序数组中查找元素的第一个和最后一个位置 (Hot 100)搜索旋转排序数组 (Hot 100)寻找旋转排序…...
专题·大模型安全 | 生成式人工智能的内容安全风险与应对策略
正如一枚硬币的两面,生成式人工智能大模型(以下简称“生成式大模型”)在助力内容生成的同时也潜藏风险,成为虚假信息传播、数据隐私泄露等问题的温床,加剧了认知域风险。与传统人工智能(AI)相比…...
CORS跨域+Nginx配置、Apache配置
CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种机制,它使用额外的HTTP头部来告诉浏览器允许一个网页运行的脚本从不同于它自身来源的服务器上请求资源(例如字体、JavaScript、CSS等)。这是一种安…...

文件查找和打包压缩【1.7】
文件查找和打包压缩【1.7】 八、文件查找和打包压缩8.1 文件查找8.1.1 locate8.1.2 findfind8.1.2.1 指定搜索目录层级8.1.2.2 先处理文件再处理目录8.1.2.3 根据文件名和inode查找8.1.2.4 根据属主属组查找8.1.2.5 根据文件类型查找8.1.2.6 空文件或目录8.1.2.7 组合条件8.1.2…...
速盾:cdn一般多长时间清理下缓存?
CDN(Content Delivery Network)是一种网络加速技术,通过将网站的静态资源(如图片、视频、CSS、JavaScript等)分布到全球各地的服务器节点上,从而提高用户访问这些资源的速度和体验。CDN还具备缓存功能&…...

react hooks--useRef
基本用法 在类组件中获取一个dom元素实例,可以通过React.CreateRef或者回调函数的方式去获取。语法:const refContainer useRef(initialValue);使用场景:在 React 中进行 DOM 操作时,用来获取 DOM作用:返回一个带有 …...
GPT对话知识库——将寄存器中的一位数据读到变量中需要什么步骤?C语言中掩码的作用。
目录 1,问: 1,答: 1. 确定目标寄存器地址 2. 定位目标位 位操作的基本步骤: 3. 示例代码 示例步骤: 4. 详细解释步骤 5. 举例 6. 常见用法 总结 注: C语言中掩码的作用:…...
【计算机网络】运输层协议解析
前言 运输层直接为应用进程间的逻辑通信提供服务。运输层向高层用户屏蔽了下面网络核心细节(如网络拓扑、路由选择协议等)它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道。 UDP与TCP对比 UDP: 无连接 支持一对…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...