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才会停止执行。

例:

  1. int i = 5 + 5;
  2. switch (i) {
  3. case 1:
  4. System.out.println("i is 1");
  5. case 10:
  6. System.out.println("i is 10");
  7. case 100:
  8. System.out.println("i is 100");
  9. case 1000:
  10. System.out.println("i is 1000");
  11. break;
  12. case 10000:
  13. System.out.println("i is 10000");
  14. default:
  15. System.out.println("default");
  16. }

以上语句的输出结果为

  1. i is 10
  2. i is 100
  3. i is 1000

Groovy 篇

Switch

Groovy 的 switch 语句类似 Java,但是 Groovy 除了支持基本类型,也支持引用类型,包含,正则匹配等各种操作。

例:

  1. static def testSwitch(var) {
  2. def result
  3. switch (var) {
  4. case 0:
  5. result = "Object equals"
  6. break
  7. case 11..20:
  8. result = "Range contains"
  9. break
  10. case [1, 2, 3]:
  11. result = "List contains"
  12. break
  13. case Float:
  14. result = "Class instance"
  15. break
  16. case { it % 3 == 0 }:
  17. result = "Closure"
  18. break
  19. case ~'[0-9]{3}':
  20. result = "Pattern match"
  21. break
  22. default:
  23. result = "Default"
  24. break
  25. }
  26. result
  27. }
  28. assert "Object equals" == testSwitch(0)
  29. assert "Range contains" == testSwitch(15)
  30. assert "List contains" == testSwitch(3)
  31. assert "Class instance" == testSwitch(4.5f)
  32. assert "Closure" == testSwitch(21)
  33. assert "Pattern match" == testSwitch(910)

以上语句的输出结果为

  1. i is 10
  2. i is 100
  3. i is 1000

Scala 篇

模式匹配

Scala 没有 switch 语句,但是有类似功能的模式匹配。模式匹配的语法在外观上有些像 Java 的 switch 语句,但是没有 break 语句,在功能上则比 Java 的 switch 语句要强大很多。

例:

  1. def matchObject(foo: Any): String = {
  2. val result = foo match {
  3. case 0 => "Object equals"
  4. case i if i == 10 || i == 11 => "Expression"
  5. case i: Int => s"Class instance holds $i"
  6. case List(1, 2, _*) => "Match the last element of a list"
  7. case Number(n) => s"Case class holds $n"
  8. case t: {def length: Int} => "Class structure contains method length"
  9. case _ => "Default"
  10. }
  11. result
  12. }
  13. println(matchObject(0)) // Object equals
  14. println(matchObject(10)) // Expression
  15. println(matchObject(20)) // Class instance holds 20
  16. println(matchObject(List(1, 2, 1000, 2000))) // Match the last element of a list
  17. println(matchObject(Number(1))) // Case class holds 1
  18. println(matchObject(List(3, 2, 1000, 2000))) // Method contains

除了以上示例,模式匹配还可以用在 try...catch语句中

  1. def matchTryCatch: Unit = {
  2. try {
  3. throw new NullPointerException
  4. } catch {
  5. case e: NullPointerException => println("NullPointerException")
  6. case e: IndexOutOfBoundsException => print("IndexOutOfBoundsException")
  7. } finally {
  8. println("finally")
  9. }
  10. }

Kotlin 篇

when 语句

Kotlin 也没有 switch 语句,但是有功能近似的 when 语句,并且使用 when 语句也不需使用 break 语句。

例:

  1. private fun test(foo: Any): String {
  2. var result = when (foo) {
  3. 0 -> "Object equals"
  4. 3, 10 -> "Or"
  5. in 11..20 -> "Range contains"
  6. is Date -> "Class instance"
  7. !in 4..30 -> "Range not contain"
  8. else -> "Default"
  9. }
  10. return result
  11. }
  12. assert("Object equals" == test(0))
  13. assert("Or" == test(3))
  14. assert("Range contains" == test(11))
  15. assert("Range not contain" == test(33))
  16. assert("Class instance" == test(Date()))

除了以上示例,when 还可以用来替代 if-else语句

  1. val x = 10
  2. val y = 20
  3. when {
  4. x + y == 5 -> println("x + y = 5")
  5. x + y == 10 -> println("x + y = 10")
  6. else -> println("x + y != 5 or 10")
  7. }

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 与模式匹配的更多相关文章

  1. Java 17 新特性:switch的模式匹配(Preview)

    还记得Java 16中的instanceof增强吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); da ...

  2. springboot 1.5.10 +kotlin 1.2.20 解决 java.lang.ClassNotFoundException: kotlin.reflect.KotlinReflectionInternalError

    使用http://start.spring.io/ 下载的 项目 跑单元测试 报 java.lang.ClassNotFoundException: kotlin.reflect.KotlinRefl ...

  3. Spark编程环境搭建(基于Intellij IDEA的Ultimate版本)(包含Java和Scala版的WordCount)(博主强烈推荐)

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  4. Java分支结构 - if...else/switch

    Java分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构. Java有两种分支结构: if语句 switch语句 if语句 一个if语句包含一 ...

  5. Java 分支结构 - if...else/switch

    Java 分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构. Java 有两种分支结构: if 语句 switch 语句 if 语句 一个 i ...

  6. Java连载20-复习、switch语句

    一.复习 1.标识符(自己定义的,下划线.美元符号) 2.驼峰命名(变量名,方法名首字母小写) 3.关键字(就是固定的那几个) 4.字面值(数据.有类型.八种基本类型从小到大,byte\char=sh ...

  7. gradle项目中如何支持java与scala混合使用?

    之前写过一篇maven项目中java与scala如何混用,今天来看看gradle项目中如何达到同样的效果: 一.目录结构 基本上跟maven一样,tips:这一堆目录结构不用死记,后面会讲如何用gra ...

  8. 【原创】大叔经验分享(17)编程实践对比Java vs Scala

    scala 官方地址 https://www.scala-lang.org/ 本文尽可能包含了一些主要的java和scala在编程实践时的显著差异,展现scala的代码的简洁优雅:scala通吃< ...

  9. 弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言

    自从 2011 年发布以来,Kotlin 凭借强大的功能在开发者中的欢迎程度与日俱增.且在一年前,Google 宣布 Kotlin 正式成为 Android 官方开发语言,由此引发了从 Java 迁移 ...

随机推荐

  1. K:单词查找树(Trie)

      单词查找树,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.Trie可以看作是一个确定有限状态自动机(DFA).与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中 ...

  2. python学习之老男孩python全栈第九期_day015知识点总结

    # 作用域相关(2)locals() # 返回本地作用域中的所有名字 globals() # 返回全局作用域中的所有名字 # 迭代器/生成器相关(3)range()print('__next__' i ...

  3. css画一个提示框

    用css画一个如下图的提示框: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  4. vue+vux 父组件控制子组件弹层

    知识点用到了vue父子组件之间的传值,以及使用watch和v-model控制vux中XDialog组件. 需要注意的问题: 1.父组件向子组件传值使用的是props(单向传值),子组件创建props, ...

  5. 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)

    题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...

  6. unrecognized selector sent to class

    Other Linker Flags=-ObjC -all_load Loads all members of static archive libraries. -ObjC Loads all me ...

  7. flutter实现(OutlineButton)线框按钮

    在flutter的控件里 常用按钮有:FlatButton,RaisedButton,FloatingActionButton,OutlineButton. FlatButton是扁平的,没有阴影的. ...

  8. Weblogic集群配置__部署润乾应用

     ◆环境: Windows xp Weblogic:wls1031_ccjk_win32.rar(内部下载:\\192.168.0.38\SystemInstaller\4WebServer\we ...

  9. mysql 运行 sql 脚本

    方式一: 打开脚本,复制里面的全部内容,登陆数据库后运行. 方式二: window cmd 运行如下命令: mysql -u root -proot --port 3306 <D:\simple ...

  10. 软工读书笔记 week 9 ——《构建之法》

    软工读书笔记  week 9                 ——<构建之法> 最近的三周我们正式开始我们的项目.然后我也把<构建之法>中的相关章节再拿出来读了一番.以下是一些 ...