Kotlin 多种形式的 when 表达式(七)

news2024/11/15 23:18:27

导读大纲

      • 1.0.1 在变量中捕捉 when 表达式
      • 1.0.2 对任意对象使用 when 表达式
      • 1.0.3 使用不带参数的 when 表达式

  1. when 表达式专题系列
    • 从枚举类引出 when 表达式

1.0.1 在变量中捕捉 when 表达式

  1. 在前面的示例中,when 表达式的评估值是color变量

    • 它是通过调用 measureColor() 函数获得的
  2. 为了避免无关变量(如本例中的color)干扰周围的代码

    • <1> when 表达式也可以将其评估项捕获到一个变量
      1. 在这种情况下,捕获变量的作用域仅限于 when 表达式的主体
      2. 同时还能在 when 表达式的分支中访问捕获变量(color)
fun getWarmthFromSensor(): String {
    return when(val color = measureColor()) {     // <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})"
    }
}
  1. 需要注意的是,当作为表达式使用时(即其结果用于赋值或作为返回值)
    • 编译器会强制构造必须穷尽,意味着所有可能的路径都必须返回一个值
    • 在前面的示例中,我们涵盖所有的枚举常量
      1. 从而使 when 结构变得详尽无遗
    • 相反,我们也可以使用 else 关键字提供默认情况
    • 如果编译器无法推断是否涵盖所有可能的路径
      1. 就会迫使我们提供默认情况

1.0.2 对任意对象使用 when 表达式

  1. Kotlin 中的 when 结构实际上比其他语言中的 when 结构更加灵活

    • 可以使用任何类型的对象作为分支条件
  2. 如果两种颜色可以在这个小调色板中混合,就将它们混合起来

    • 我们的选项并不多,而且可以很容易地枚举出所有选项
    • 如果颜色 c1 和 c2 分别是红色和黄色(反之亦然)
      1. 混合后的结果就是橙色,以此类推
    • 要实现这一点,需要使用集合比较,Kotlin 标准库包含一个函数 setOf
      1. 该函数创建一个集合, 其中包含作为参数指定的对象
    • <1> when 表达式的参数可以是任何对象
      1. 它会被检查是否与分支条件相等
    • <2> 枚举可以混合的颜色对
    • <3> 如果其他分支都不匹配, 则执行该分支
fun mix(c1: Color, c2: Color) =
    when (setOf(c1, c2)) {                     // <1>
        setOf(RED, YELLOW) -> ORANGE           // <2>
        setOf(YELLOW, BLUE) -> GREEN
        setOf(BLUE, VIOLET) -> INDIGO
        else -> throw Exception("Dirty color") // <3>
    }
fun main() {
    println(mix(BLUE, RED))
    // GREEN
}
  1. 集合是一个元素的顺序并不重要的collection

    • 如果两个集合包含相同的元素,它们就是相等
    • 因此,如果集合 setOf(c1, c2) 和 setOf(RED, YELLOW) 相等
      1. 那么 c1 是红色, c2 是黄色, 反之亦然
  2. when 表达式依次将其参数与所有分支匹配,直到满足某个分支条件为止

    • 因此,首先检查 setOf(c1,c2) 与 setOf(红色,黄色)是否相等
      1. 然后再逐个检查其他颜色对是否相等
    • 如果其他分支条件都不满足,则评估 else 分支
    • 由于 Kotlin 编译器无法推断出我们已经涵盖所有可能的颜色集组合
      1. 而且 when 表达式的结果会被用作 mix 函数的返回值
      2. 因此我们不得不提供一个默认情况,以保证 when 表达式确实是穷尽的
        title
  3. 在很多情况下,将任何表达式用作分支条件都能让你写出简洁漂亮的代码

    • 在本例中,条件是相等检查
    • 接下来,你将看到条件可以是任何布尔表达式

1.0.3 使用不带参数的 when 表达式

  1. 您可能已经注意到,上个示例的效率有点低

    • 每次调用该函数,它都会创建多个 Set 实例
      1. 这些实例仅用于检查两种给定颜色是否与另两种颜色匹配
      2. 通常情况下, 这并不是一个问题
    • 但如果经常调用该函数,值得以另一种方式重写代码
      1. 避免创建许多需要由垃圾回收器清理的短期对象
  2. 为此,可以使用不带参数的 when 表达式

    • 代码的可读性较差,但这往往是为获得更好性能而必须付出的代价
    • <1> when表达式没有参数
    • <2> 作为表达式使用时, “when” 的分支必须穷尽
fun mixOptimized(c1: Color, c2: Color) =
    when {                                        // <1>
        (c1 == RED && c2 == YELLOW) || (c1 == YELLOW && c2 == RED) -> ORANGE
        (c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) -> GREEN
        (c1 == BLUE && c2 == VIOLET) || (c1 == VIOLET && c2 == BLUE) -> INDIGO
        else -> throw Exception("Dirty color")    // <2>
    }
fun main() {
    println(mixOptimized(BLUE, YELLOW))
    // GREEN
}
  1. 如果没有为 when 表达式提供参数,分支条件就是任何布尔表达式
    • mixOptimized 函数的功能与 mix 之前的功能相同
    • mixOptimized的优点是不会创建任何额外对象,但代价可读性较差

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pip的安装和使用

pip的安装和使用 1、 pip 是一个现代的&#xff0c;通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。便于我们对Python的资源包进行管理。 2、注&#xff1a;pip 已内置于 Python 3.4 和 2.7 及以上版本&#xff0c;其他版本需另行安装。 3、在安…

java并发工具包JUC(Java Util Concurrent)

1. 什么是JUC 1.1 JUC简介 JUC&#xff08;Java Util Concurrent&#xff09;是Java中的一个并发工具包&#xff0c;提供了一系列用于多线程编程的类和接口&#xff0c;旨在简化并发编程并提高其效率和可维护性。JUC库包含了许多强大的工具和机制&#xff0c;用于线程管理、同…

多比特AI事业部VP程伟光受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 武汉市多比特信息科技有限公司AI事业部VP程伟光先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“AI对于项目经理工作的影响和变化解析”。大会将于10月26-27日在北京举办&am…

如何将Vue项目部署至 nginx

一、准备工作 1.确保安装了开发软件 VS Code&#xff08;此处可查阅安装 VS Code教程&#xff09;&#xff0c;确保相关插件安装成功 2.安装Node.js 和创建Vue项目&#xff08;此处可查阅安装创建教程&#xff09; 3.成功在VS Code运行一个Vue项目&#xff08;此处可查阅运行…

【LeetCode】动态规划—打家劫舍(附完整Python/C++代码)

动态规划—#198. 打家劫舍 前言题目描述基本思路1. 问题定义:2. 理解问题和递推关系:3. 解决方法:4. 进一步优化:5. 小总结: 代码实现Python3代码实现Python 代码解释C代码实现C 代码解释 总结: 前言 在这个问题中&#xff0c;你是一个专业的小偷&#xff0c;计划偷窃沿街的房…

JinDouYun性能测试工具使用方法

1.功能介绍 2. 安卓端支持安卓6及以上的版本&#xff0c;ios支持大部分版本 3. 可以测试游戏&#xff0c;视频&#xff0c;普通应用的性能数据&#xff0c;数据精准&#xff0c;低延迟&#xff0c;无侵入 4.工具下载链接 筋斗云 5.后续功能添加&#xff0c;高版本支持&…

网页爬虫法律与道德:探索法律边界与道德规范

目录 引言 一、网络爬虫技术概述 1.1 定义与功能 1.2 技术原理 1.3 案例分析 二、网络爬虫的法律边界 2.1 合法性要求 2.2 刑事风险 2.3 案例分析 三、网络爬虫的道德规范 3.1 尊重版权和隐私 3.2 合理使用爬虫技术 3.3 透明度和社会责任 四、技术挑战与应对策略…

[linux 驱动]块设备驱动详解与实战

目录 1 描述 2 结构体 2.1 block_device_operations 2.2 gendisk 2.3 block_device 2.4 request_queue 2.5 request 2.6 bio 3.7 blk_mq_tag_set 3.8 blk_mq_ops 3 相关函数 3.1 注册注销块设备 3.1.1 register_blkdev 3.1.2 unregister_blkdev 3.2 gendisk 结构…

SpringBoot开发——整合Hutool工具类轻松生成验证码

文章目录 1、Hutool简介2、验证码效果展示2.1 扭曲干扰验证码2.2 线条干扰验证码2.3 圆圈干扰验证码3、验证码应用场景3.1. 用户注册与身份验证3.2. 支付验证3.3. 订单与物流通知3.4. 信息安全与隐私保护3.5. 通知与提醒3.6. 其他应用场景4、Hutool工具类实现验证码生成4.1 引入…

如何使用ssm实现基于VUE的儿童教育网站的设计与实现+vue

TOC ssm676基于VUE的儿童教育网站的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全…

API公共开放平台设计

背景 随着业务发展未来会有更多的三方应用接入公司平台,目前为服务商定制的机制无法满足三方应用快速接入,所以需要一个更加通用的解决方案,开放平台势在必行。 目标 设计一套通用协议,可以支持其他应用快速接入。 说明 本方案旨在设计整体架构,以及对为何这样设计做…

React 理解 re-render 的作用、概念,并提供详细的例子解释

一、什么是 re-render 在 React 中 re-render&#xff08;重新渲染&#xff09; 是经常发生的行为&#xff0c;主要确保视图要时刻保持最新的数据来呈现。 但每次发生 re-render 也是有代价的&#xff0c;比如数据状态、focus 焦点、表单数据、都得重置&#xff0c; 遇到代码…

获取商品销量详情API:深入解析返回值,助力电商决策

在电商行业&#xff0c;了解商品的销量详情对于商家制定营销策略、优化库存管理和提升用户体验至关重要。通过调用获取商品销量详情的API接口&#xff0c;商家可以实时获取关键的销售数据&#xff0c;从而做出更加明智的决策。本文将深入解析获取商品销量详情API的返回值&#…

linux信号| 学习信号三步走 | 学习信号需要打通哪些知识脉络?

前言: 本节内容主要讲解linux下信号的预备知识以及信号的概念&#xff0c; 信号部分我们将会分为几个阶段进行讲解&#xff1a;信号的概念&#xff0c; 信号的产生&#xff0c; 信号的保存。本节主要讲解信号 ps:本节内容适合学习了进程相关概念的友友们进行观看哦 目录 什么是…

轻松重置 MySQL 8.0 Root 密码的简便方法!

在Windows环境下安装MySQL数据后&#xff0c;如果忘记了 MySQL 8.0 的 root 密码&#xff0c;不必担心&#xff01;通过 --skip-grant-tables 和 named-pipe 模式登录后&#xff0c;只需几步简单的 SQL 命令即可重置密码&#xff1a;刷新权限表、修改密码、再刷新权限&#xff…

SpringBoot+Thymeleaf租房管理系统

> 这是一个基于SpringBootThymeleafBootstrap实现的租房管理系统。 > 功能比较完善&#xff0c;包括用户注册/登录、房源登记、账单费用配置、统计报告等功能。 > 模拟真实使用环境&#xff0c;包括了自然人与法人的身份证明录入、房产证信息录入、通过邮件推送月…

E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning

论文汇总 存在的问题 1.以前的提示微调方法那样只关注修改输入&#xff0c;而应该明确地研究在微调过程中改进自注意机制的潜力&#xff0c;并探索参数效率的极限。 2.探索参数效率的极值来减少可调参数的数量? 解决办法 提示嵌入进行transformer中 提示剪枝 Token-wise …

学生网上选课系统设计与实现

学生网上选课系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装学生网上选课系统软件来发挥其…

托盘检测系统源码分享

托盘检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

两数之和、三数之和、四数之和

目录 两数之和 题目链接 题目描述 思路分析 代码实现 三数之和 题目链接 题目描述 思路分析 代码实现 四数之和 题目链接 题目描述 思路分析 代码实现 两数之和 题目链接 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 题目…