带你领略 Kotlin 中的 “when”魔法

微生物组β-多样性——PCoA分析及可视化 让你的数据映入眼帘 阅读详情

提到 when,大家都会联想到 Java 中的 switch,然而在 kotlin 中,when 显然比 Java 中的 switch 要强大得多。首先,我们先来看看 when 的特点:

  • 它可以作为表达式使用
  • 使用更加安全
  • 强大灵活的分支结构
  • 可以不带参数

接下来,我来带大家逐步领略这些特点。以下面这段 Java 功能代码为例:

switch(animal) {
    case EAGLE:
        System.out.println("鸟类");
        break;
    case DOLPHIN:
        System.out.println("兽类");
        break;
    case LOCUST:
        System.out.println("昆虫类");
        break;
    case CARP:
        System.out.println("鱼类");
        break;
    case TIGER:
        System.out.println("兽类");
        break;
    case DUCK:
        System.out.println("鸟类");
        break;
    default:
        System.out.println("未知动物");
        break;
}

从以上代码可以看出,我们这里实现的功能是:通过用户输入一个动物名称来得到其对应的种类信息。乍一看,你可能会觉得上面的代码再正常不过,但是倘若我们的输入情形很多的话,就会增加密密麻麻的限制条件,这肯定是我们不想看到的。那么,让我们来看看通过 Kotlin 的 when 表达式如何实现相同功能:

when(animal) {
    EAGLE, DUCK -> println("鸟类")
    DOLPHIN, TIGER -> println("兽类")
    CARP -> println("鱼类")
    LOCUST -> println("昆虫类")
    else -> println("未知动物")
}

OK,以上就是该功能代码的 kotlin 实现方式,代码不仅简化了很多,也省去了大量的 break 语句,避免了 Java 中因遗漏 break 而导致的 bug,增强了安全性。如果匹配成功,对应的分支便会执行,同时也可以把多个情况合并到同一个分支,只需要通过逗号隔开,并没有额外的代码。

PS:每个条件分支的处理通过在 -> 之后来进行。

作为表达式使用

首先,我们需要重温一下表达式与语句的区别。表达式有值,并能作为另一个表达式的一部分来使用;而语句没有返回值。Java 中的控制结构皆为语句。而在 Kotlin 中,除了循环体结构外,大多数控制结构都是表达式。举个栗子?,还是上面的例子,我们可以将其优化为以下代码:

var result = when(animal) {
    EAGLE, DUCK -> "鸟类"
    DOLPHIN, TIGER -> "兽类"
    CARP -> "鱼类"
    LOCUST -> "昆虫类"
    else -> "未知动物"
}
// 输入:DUCK,返回:当前动物的种类为:鸟类
println("当前动物的种类为: $result")

此外,我们也可以直接通过表达式函数来直接得到最终的结果:

fun displayAnimalType(animal: Animal) =
            when(animal) {
                Animal.EAGLE, Animal.DUCK -> "鸟类"
                Animal.DOLPHIN, Animal.TIGER -> "兽类"
                Animal.CARP -> "鱼类"
                Animal.LOCUST -> "昆虫类"
                else -> "未知动物"
            }
强大灵活的分支

Kotlin 中的 when 远比 Java 当中的 switch 要强大得多。switch 只能以常量作为分支条件,而 when 允许使用任意对象。emmm~举个简单的例子吧:

fun handleResult(score: Int) =
            when(score) {
                in 0..39 -> "fail to go up to the next grade."
                in 40 until 60 -> "not pass, should test again."
                97,98,99,100 -> "learning outstanding results."
                else -> "pass the test."
            }

Java 当中,当我们的分支情况比较多或者每种分支可能会重复多次时,势必会通过 if-else 来各种判断,而在 Kotlin 当中,一个 when 就能帮我们完成这些操作。

此外,如果你想判断一个未知变量的类型,而其可能类型有很多种可能性,那么也可以通过 when 来实现,例如:

fun judgeAnimalKind(animal: Any) =
            when(animal) {
                is Bird -> "这是鸟类"
                is Fish -> "这是鱼类"
                judgeIfInsect(animal) -> "这是昆虫"
                else -> "我不知道这是什么动物"
            }

当然,我们也可以将代码块作为我们的分支体,这时候,代码块中最后一个表达式或者变量就是该分支体的返回结果,如:

fun judgeAnimalKind(animal: Any) =
            when(animal) {
                is Bird -> "这是鸟类"
                is Fish -> "这是鱼类"
                judgeIfInsect(animal) -> "这是昆虫"
                else -> {
                    val kind = if (judgeDolphin(animal) || judgeTiger(animal)) {
                        "这是兽类"
                    }else {
                        "我不知道这是什么动物"
                    }
                    kind
                }
            }

上述代码中,kind 即为我们的 else 分支块中的最终返回结果。

无参的情况

特别地,when 中的参数可能并非满足我们的需求,我们可以选择省略该参数,例如这样:

when {
    phoneNumber?.length != 11 -> toast("illegal phone number.")
    password.isNullOrEmpty() -> toast("please input password")
}
总结

通过以上的介绍,我们不难发现:when 的使用场景要比 Java 的 switch 灵活、强大的多,同时,我们也可以借助 when 来重构和优化复杂的 if-else 结构,以简化我们的代码,提高代码的可读性。

Sigrity System SI SerialLink模式进行SFP+协议仿真分析-PCB操作指导 Random(Rj):随机抖动,该抖动用高斯概率分布来描述,通常是由热噪声和其它随机噪声引起的,默认为1%UI RMS(平均值),即和标准值的偏差为1%UI。Random(Rj):随机抖动,该抖动用高斯概率分布来描述,通常是由热噪声和其它随机噪声引起的,默认为1%UI RMS(平均值),即和标准值的偏差为1%UI。Random(Rj):随机噪声,是由信号电压的随机波动引起的,默认为1mv RMS(平均值),即和标准值的偏差为1mv。 阅读详情

相关推荐

告别路径打架!用Python实现CBS算法搞定仓库机器人调度(附完整代码)

本文详细介绍了如何使用Python实现CBS(Conflict-Based Search)算法解决仓库机器人调度中的路径冲突问题。通过多智能体路径规划(MAPF)技术,有效避免AGV在智能仓库中的碰撞和死锁,提供完整代码实现和工业场景优化技巧,帮助开发者快速构建高效的机器人调度系统。

weixin_30275415的博客 331

Kotlin专题「四」:逻辑控制语句(if、for、when、while、return、break、continue)

前言: 有些路看起来很近,可是走下去却很远,缺少耐心的人永远走不到尽头。人生,一半是现实,一般是梦想。 一、概述   前面几篇文章中讲解了 Kotlin 的常量、变量、数据类型和作用域函数等,与 Java 相比还是有一定的区别。这里给大家介绍 Kotlin 的相关逻辑控制语句,如:if,for,when,while等。Kotlin 中没有 Java 中的三元运算符,但是用if语句可以实现类似效果;when语句替代了 Java 中的 switch语句;for循环语句废除了 Java 中的(初始值;条件;..

https://juejin.cn/user/1654096907477549/posts 2780

elementui中el-select和el-tree实现下拉树形多选功能

elementui中el-select和el-tree实现下拉树形多选功能

weixin_49203377的博客 6557

Kotlin学习(三)—— 基本类型,包,控制流:if、when、for、while,Break和continue...

一.基本类型 Kotlin的数字表现,如下 Double 64 Float 32 Long 64 Int 32 Short 16 Byte 8 这些就是全部的定义数字的方式了,而我们一般的写法也和JAVA类似 十进制: 10086 十六进制:0x0F 二进制: 0b00001011 Long...

weixin_33755847的博客 321

避坑指南:C#调用CodeSoft打印标签时常见的5个错误及解决方法

本文总结了C#调用CodeSoft打印标签时常见的5个核心错误及解决方案,涵盖环境配置、模板加载、变量赋值、打印机切换和资源管理。重点解析了如何避免COM对象创建失败、模板路径错误、变量名不匹配、打印机切换异常及内存泄漏等问题,帮助开发者实现稳定高效的标签打印集成。

weixin_29215815的博客 229

Allegro PCB设计实战:5分钟搞定DDR信号线的Match Group等长规则设置

本文详细介绍了在Allegro PCB设计中,如何快速为DDR信号线设置Match Group等长规则。通过实战演练,解析了从理解相对传输延迟原理、在规则管理器中创建Match Group,到设置合理容差和利用动态绕线指示的全流程,帮助工程师在5分钟内高效完成高速信号时序约束,提升设计可靠性与效率。

gg901的博客 1055

Kotlin学习之路(二):控制流

Kotlin学习之路(二):控制流

RQ997832的专栏 3118

搞定ESD(五):静电放电问题分析与调试

前面深入分析了静电放电的干扰机理、耦合路径,从现在开始将进入下一个大家非常关注的环节:静电放电问题分析与调试,掌握静电放电问题的分析方法,快速锁定敏感设备或者耦合路径,可以达到事半功倍的效果。

记得诚 2795

Kotlin学习笔记(3)-when

java中的switch被kotlin中的when取代。我们都知道,java中的switch有非常多不好用的地方,例如只能使用于原始类型和字符串,经常会忘写break导致bug….总之我都是尽量不用switch,而用if elseif的。不过在kotlin中,这些问题都得到了很好的解决,我们看看when是怎么起作用的。 1.首先when是一个表达式,而不像java里的switch是一个单纯的执

o83290102o5的博客 491

2025.06.16【转录组】|Ribo-seq数据流程详解(二 基因组比对)

本文详细介绍了Ribo-seq数据分析中的比对流程,包括环境准备、STAR索引构建、比对参数设置及结果统计可视化。通过samtools和R脚本实现比对质量评估,提供常见问题解决方案和关键指标解读。该流程强调比对参数优化和质量控制,为后续翻译组学分析奠定基础。

1980

13《CAN总线五种错误类型,故障判定全解析》

CAN总线规定,发送节点在发送完EOF字段后,会留出一个ACK Slot(应答槽)。这个槽里,发送节点自己会输出隐性电平(逻辑1),然后“期待”至少有一个其他节点在这个槽里把它拉成显性电平(逻辑0)。如果这个槽结束时仍然是隐性电平,发送节点就判定:刚才那帧报文,没有任何一个节点成功接收——这就是应答错误。简单说,就是“我喊了一嗓子,却没人应声”。

2401_88858637的博客 265

Kotlin的when、if 和循环语句

本文整理自:https://chiclaim.blog.youkuaiyun.com/article/details/88624808 一. when语句 在 Java 中有 switch 语句,在 Kotlin 中使用 when 来代替 switch 1) when 的基本语法 when(parameter){ branch1 -> logic branch2 -> l...

Robin Hu的专栏 2889

N32G430学习笔记11- systick使用函数-延时函数

N32学习笔记11- systick使用函数-延时回调函数-延时函数

Car12 1416

Kotlin-简约之美-进阶篇(二):when的使用详解

提到 when,大家都会联想到 Java 中的 switch,然而在 kotlin 中,when 显然比 Java 中的 switch 要强大得多。首先,我们先来看看 when 的特点: 它可以作为表达式使用 使用更加安全 强大灵活的分支结构 可以不带参数 接下来,我来带大家逐步领略这些特点。以下面这段 Java 功能代码为例: switch(animal) { case EAGLE:...

门心叼龙的专栏 1978

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

初探 Kotlin

想写这个教程有三个原因,一是 Kotlin 作为一种新兴的编程语言,优点实在是太多,值得花时间学习掌握;二是 Kotlin 作为新兴的语言,各种教程和资料相当不完善,我作为 Kotlin 的喜爱者,也想为 Kotlin 的发展贡献自己的力量;三是因为我在学习 Kotlin 时,被各种特性搞得焦头烂额,所以想写个更加有条理、更清晰易懂的 Kotlin 教程。好了,闲话少叙,让我...

weixin_34381687的博客 119

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

kotlin 的 when 语句学习笔记

kotlin 中 when 的基本使用方法 kotlin 中的 when 的基本使用方法与 Java 中的 switch 类似。 下面分别是用 Java 的 switch 和 kotlin 的 when 实现同一逻辑的代码。 // Java 代码 switch(x){ case 1: System.out.println("x is 1"); break; case 2: System.out.println("x is 2"); break; case 3: System.out.p

FREE_CODER 4734

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Kotlin学习(2)语法

1. 变量和标志符 kotlin所有的变量类型都是引用类型。 Kotlin的变量分为 val(不可变的)和 var(可变的),可以简单理解为: val是只读的,仅能一次赋值,后面就不能被重新赋值了 var是可写的,在它的声明周期中,它能被赋值很多次 比如: 而把val->var,这个操作就不会报错。 变量命名规则同Java一样。所以我们平时都遵循驼峰命名法 2. 关键字与修饰符 ...

RikkaTheWorld 334

Kotlin条件控制及循环

文章目录条件控制及分支if表达式区间when表达式Kotlin循环for循环while循环跳出循环 条件控制及分支 if表达式 一个 if 语句包含一个布尔表达式和一条或多条语句。 var max = a if(a > b) { max = a }else { max = b } or var max = if(a > b) a else b 区间 kotlin中可以使用.., ...

csdnxia的博客 811

[Kotlin]Kotlin学习笔记(二):Kotlin中流程控制语句的学习(条件、跳转、循环)

Kotlin中流程语句的学习(条件、跳转、循环)

身披白袍的博客 803

Kotlin条件控制及循环(1)

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

2401_83692985的博客 900

Kotlin条件控制及循环(1),腾讯T3大牛亲自教你

为了方便有学习需要的朋友,我把资料都整理成了视频教程(实际上比预期多花了不少精力)当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

2401_84121998的博客 661

Kotlin-控制流程

Kotlin-控制流程

weixin_61494821的博客 704

Kotlin学习(三):表达式

文章目录一、常量与变量(var、val、const的使用与区别)1.var、val、const的使用与区别2.编译期和运行时常量二、分支表达式1. if..else2.when表达式 类似于 java的switch3.try..catch三、kotlin运算符重载与中辍表达式1.kotlin运算符重载2.kotlin中辍表达式 infix四、Lambda表达式1.kotlin匿名函数2.匿名函数的类型3.Lambda表达式的定义,java与kotlin对比总结 一、常量与变量(var、val、const的使

Pumpkin's Blog 326

Kotlin 条件控制知识(三)

Kotlin 条件控制知识if操作符使用区间when 三种情况类似于switch不带参数,类似于 if-else-if直接返回赋值for循环带索引的遍历遍历mapwhile && do...while返回、跳转标签限制跳转 if操作符 三元操作符 val c = if (condition) a else b if表达式结果赋值给变量 val max = if(a>b){ ...

weixin_41802023的博客 312

Kotlin学习笔记(二)—— when

when 语句是 Java中 switch 的强化版,它对一个值进行判断,直到匹配到或者没有可匹配的值。 有参数 when when单值匹配 当 when 语句没有返回值时,就不必要列举出所有的可能性,如: fun whenFun(x: Int) { when(x) { 0 -> "less than 2" 1 -> "less than 2" ...

朝哥的博客 607

Kotlin流程控制语句

文章结构: 分支语句(if、when) 循环语句(for、while) 跳转语句(break、continue、return、label、throw) 分支语句(if、when) if 表达式 在kotlin中 if是一个表达式,它会返回一个值 if分支可以是代码块,最后的表达式作为该块的值(最后一行为其返回值) fun main(args: Array<String>) { println("hello kotlin !") println(max(2,9))

伯特立的专栏 1568
上一篇: Flutter 之 AppBar 这样的骚操作你知道吗?
下一篇: 一篇文章带你领略Android混淆的魅力
水月沐风
博客等级 码龄10年 186粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值