Java & Groovy & Scala & Kotlin - 20.Switch 与模式匹配
Overview
本章主要介绍高级条件语句中的 switch 语句以及其增强版的模式匹配。
Java 篇
Switch
特点
- Java 中 switch 语句功能类似 if,但是 switch 主要用在多条件分支上。
- switch 语句由 case 分支和 default 组成,case 分支用于检查条件,且参数必须为常量,default 用于执行当任何 case 分支都不匹配时执行的语句。
- switch 语句 在 Java 1.7 以前只支持基本类型,Java 1.7 开始支持 String
- 执行时 switch 语句会从上而下检查与 case 条件是否一致,一旦发现相等的分支,switch 语句就会执行该条 case 分支下的语句,并且之后会忽略下面的所有 case 分支,直到遇到
break才会停止执行。
例:
int i = 5 + 5;
switch (i) {
case 1:
System.out.println("i is 1");
case 10:
System.out.println("i is 10");
case 100:
System.out.println("i is 100");
case 1000:
System.out.println("i is 1000");
break;
case 10000:
System.out.println("i is 10000");
default:
System.out.println("default");
}
以上语句的输出结果为
i is 10
i is 100
i is 1000
Groovy 篇
Switch
Groovy 的 switch 语句类似 Java,但是 Groovy 除了支持基本类型,也支持引用类型,包含,正则匹配等各种操作。
例:
static def testSwitch(var) {
def result
switch (var) {
case 0:
result = "Object equals"
break
case 11..20:
result = "Range contains"
break
case [1, 2, 3]:
result = "List contains"
break
case Float:
result = "Class instance"
break
case { it % 3 == 0 }:
result = "Closure"
break
case ~'[0-9]{3}':
result = "Pattern match"
break
default:
result = "Default"
break
}
result
}
assert "Object equals" == testSwitch(0)
assert "Range contains" == testSwitch(15)
assert "List contains" == testSwitch(3)
assert "Class instance" == testSwitch(4.5f)
assert "Closure" == testSwitch(21)
assert "Pattern match" == testSwitch(910)
以上语句的输出结果为
i is 10
i is 100
i is 1000
Scala 篇
模式匹配
Scala 没有 switch 语句,但是有类似功能的模式匹配。模式匹配的语法在外观上有些像 Java 的 switch 语句,但是没有 break 语句,在功能上则比 Java 的 switch 语句要强大很多。
例:
def matchObject(foo: Any): String = {
val result = foo match {
case 0 => "Object equals"
case i if i == 10 || i == 11 => "Expression"
case i: Int => s"Class instance holds $i"
case List(1, 2, _*) => "Match the last element of a list"
case Number(n) => s"Case class holds $n"
case t: {def length: Int} => "Class structure contains method length"
case _ => "Default"
}
result
}
println(matchObject(0)) // Object equals
println(matchObject(10)) // Expression
println(matchObject(20)) // Class instance holds 20
println(matchObject(List(1, 2, 1000, 2000))) // Match the last element of a list
println(matchObject(Number(1))) // Case class holds 1
println(matchObject(List(3, 2, 1000, 2000))) // Method contains
除了以上示例,模式匹配还可以用在 try...catch语句中
def matchTryCatch: Unit = {
try {
throw new NullPointerException
} catch {
case e: NullPointerException => println("NullPointerException")
case e: IndexOutOfBoundsException => print("IndexOutOfBoundsException")
} finally {
println("finally")
}
}
Kotlin 篇
when 语句
Kotlin 也没有 switch 语句,但是有功能近似的 when 语句,并且使用 when 语句也不需使用 break 语句。
例:
private fun test(foo: Any): String {
var result = when (foo) {
0 -> "Object equals"
3, 10 -> "Or"
in 11..20 -> "Range contains"
is Date -> "Class instance"
!in 4..30 -> "Range not contain"
else -> "Default"
}
return result
}
assert("Object equals" == test(0))
assert("Or" == test(3))
assert("Range contains" == test(11))
assert("Range not contain" == test(33))
assert("Class instance" == test(Date()))
除了以上示例,when 还可以用来替代 if-else语句
val x = 10
val y = 20
when {
x + y == 5 -> println("x + y = 5")
x + y == 10 -> println("x + y = 10")
else -> println("x + y != 5 or 10")
}
Summary
- Java 和 Groovy 支持 switch 语句,但是 Groovy 功能更强大
- Scala 支持的模式匹配功能最强大
- Kotlin 支持 when 语句
文章源码见 https://github.com/SidneyXu/JGSK仓库的 _20_switch_match小节
作者:bookislife
链接:https://www.jianshu.com/p/e65d1dd4e911
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Java & Groovy & Scala & Kotlin - 20.Switch 与模式匹配的更多相关文章
- Java 17 新特性:switch的模式匹配(Preview)
还记得Java 16中的instanceof增强吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); da ...
- springboot 1.5.10 +kotlin 1.2.20 解决 java.lang.ClassNotFoundException: kotlin.reflect.KotlinReflectionInternalError
使用http://start.spring.io/ 下载的 项目 跑单元测试 报 java.lang.ClassNotFoundException: kotlin.reflect.KotlinRefl ...
- Spark编程环境搭建(基于Intellij IDEA的Ultimate版本)(包含Java和Scala版的WordCount)(博主强烈推荐)
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- Java分支结构 - if...else/switch
Java分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构. Java有两种分支结构: if语句 switch语句 if语句 一个if语句包含一 ...
- Java 分支结构 - if...else/switch
Java 分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构. Java 有两种分支结构: if 语句 switch 语句 if 语句 一个 i ...
- Java连载20-复习、switch语句
一.复习 1.标识符(自己定义的,下划线.美元符号) 2.驼峰命名(变量名,方法名首字母小写) 3.关键字(就是固定的那几个) 4.字面值(数据.有类型.八种基本类型从小到大,byte\char=sh ...
- gradle项目中如何支持java与scala混合使用?
之前写过一篇maven项目中java与scala如何混用,今天来看看gradle项目中如何达到同样的效果: 一.目录结构 基本上跟maven一样,tips:这一堆目录结构不用死记,后面会讲如何用gra ...
- 【原创】大叔经验分享(17)编程实践对比Java vs Scala
scala 官方地址 https://www.scala-lang.org/ 本文尽可能包含了一些主要的java和scala在编程实践时的显著差异,展现scala的代码的简洁优雅:scala通吃< ...
- 弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
自从 2011 年发布以来,Kotlin 凭借强大的功能在开发者中的欢迎程度与日俱增.且在一年前,Google 宣布 Kotlin 正式成为 Android 官方开发语言,由此引发了从 Java 迁移 ...
随机推荐
- Session和Cookie之间区别与联系
一. 概念理解 你可能有留意到当你浏览网页时,会有一些推送消息,大多数是你最近留意过的同类东西,比如你想买桌子,上淘宝搜了一下,结果连着几天会有各种各样的桌子的链接.这是因为 你浏览某个网页的时候,W ...
- Jsp&Servlet入门级项目全程实录第8讲
惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 1.添加dao public int studentAdd(Connection con,Student studen ...
- 中小型研发团队架构实践五:Redis快速入门及应用
Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...
- CRM Online Outlook Client Configuration Wizard
CRM Outlook客户端满足和便捷了用户对office outlook和CRM两个程序的使用需求.通过CRM outlook 客户端,用户可以像在浏览器中访问CRM一样,流畅的读写CRM数据.同时 ...
- 【linux】扒站命令之利用wget快速扒站利用wget快速扒站
在Linux下,通过一个命令就可以把整个站相关的文件全部下载下来. wget -r -p -k -np 参数说明: -r : 递归下载 -p : 下载所有用于显示 HTML 页面的图片之类的元素 -k ...
- 使用99元一年的256MB高性能阿里云Redis加速Discuz论坛
介绍 Discuz是一个常见的论坛,支持使用Redis来对论坛进行加速访问,对于访问量比较大的论坛能够取到很好的作用,本文介绍如何使用阿里云高性价比256MBRedis来加速该论坛. 阿里云Redis ...
- APP之红点提醒三个阶段
下面这个页面就是我们进入APP后的主界面.客户选项的红点上数字就是显示我们没有查看的客户总数量. 当我们切换到客户这个fragment时,会显示贷款客户数量与保险客户数量. 当我们随便点击入一 ...
- 初次使用git就遭遇不测,提示没有这个服务连接和需要配置git的一个http参数 NO network connection,SSl host could not be verified ...
第一次使用git 拉取服务上的项目到本地,结果,在拿到访问的url地址后,输入用户名密码,失败了. --eclispe 4.5.3 继承了git客户端插件的版本 ------下一步后,报错 NO n ...
- gitlab的仓库迁移到新的gitlab
1.下载原有gitlab源码 git clone http://gitlab.**.com/projectName gitlab地址替换成为新gitlab地址 git remote set-url o ...
- Python-Image 基本的图像处理操作
Python-Image 基本的图像处理操作,有需要的朋友可以参考下. Python 里面最常用的图像操作库是 Image library(PIL),功能上,虽然还不能跟Matlab比较,但是还是比较 ...