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: 无连接 支持一对…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 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…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
