java&groovy&scala&kotlin-20.switch与模式匹配

zzfx      2022-04-29     560

关键词:

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 和 Scala 中的泛型

】关于Java和Scala中的泛型【英文标题】:AboutgenericsinJavaandScala【发布时间】:2012-05-2107:01:03【问题描述】:我对通用子类型感到困惑。在Java中,如果类型A是B的子类型,则泛型类型C<A>和C<B>是不变的。例如,... 查看详情

手把手教你接口自动化测试–soapui&groovy

阅读这篇文章需要一定的SoapUI基础,至少入过门,另外还需要一些Groovy的知识,当然如果你会java也可以,这里用到的Groovy知识和Java很类似。另外,本文的思路和我上一篇文章<零成本实现接口自动化测试–Java+TestNG测试Restfulser... 查看详情

将 Java 映射转换为 Scala 映射

】将Java映射转换为Scala映射【英文标题】:ConvertJavaMaptoScalaMap【发布时间】:2013-05-3021:58:03【问题描述】:我有一个java地图:java.util.Map&lt;SomeObject,java.util.Collection&lt;OtherObject&gt;&gt;我想将其转换为scala地图:Map[SomeObje... 查看详情

scala方法&函数

写在前面众所周知,scala一向宣称自己是面向函数的编程,(java表示不服,我是面向bean的编程!)那什么是函数?在接触java的时候,有时候用函数来称呼某个method(实在找不出词了),有时候用方法来称呼某个method,虽然method... 查看详情

scala&intellijidea:环境搭建helloworld

...hX做数据分析及图像展示,但前提是得回spark;spark是基于scala的,scala是基于JAVA的……所以,要想用SparkGraphX,技术堆栈大体上应该是这样的:Java->Scala->Spark->SparkGraphX。  查看详情

Scala - 布尔值 - & vs &&, |与 ||

】Scala-布尔值-&vs&&,|与||【英文标题】:Scala-Booleans-&vs&&,|vs||【发布时间】:2014-09-2322:01:28【问题描述】:我刚刚注意到在Scala中Boolean支持&amp;和&amp;&amp;。这两个运营商有区别吗?Scala文档对它们都使用... 查看详情

java示例代码_Scala/Java servlet:如何输出<;在HTML代码中,而不是&;书信电报;

java示例代码_Scala/Java servlet:如何输出<;在HTML代码中,而不是&;书信电报; 查看详情

如何使用 Java 调用 Groovy 或 Scala UDF 来更新 Oracle?

】如何使用Java调用Groovy或ScalaUDF来更新Oracle?【英文标题】:HowtocallGroovyorScalaUDFtoupdateOracle,usingJava?【发布时间】:2017-06-1307:26:49【问题描述】:我有一个到Oracle数据库的JDBC连接。我还有一些用Groovy或Scala编写的函数f(x)。例如,... 查看详情

scala基础:运算符和流程控制(代码片段)

@TOC一、运算符Scala中的运算符和Java中的运算符基本相同。算术运算+-*/%,+和-在一元运算表中示正号和负号,在二元运算中表示加和减。/表示整除,只保留整数部分舍弃掉小数部分除此之外,+也表示两个字符串相加关系运算==!... 查看详情

scala操作符&运行

---恢复内容开始---#操作符运算数学操作符 +-*/%比较操作符<>>==<逻辑操作符&&||对等操作符== !=位操作符&|^~#标识符与命名字母开头,字母数字下划线"`"括起来的任意字符串 #语句结束分号和换行符 ... 查看详情

scala基础&函数(代码片段)

基础的scala语法和函数packagecom.yjm.scalaobjectPersondefmain(args:Array[String]):Unit=varage=20if(age>20)println("可以观看欧美")elseif(age>18)println("可以看国产")elseprintln("禁止观看")varcount=1while(count& 查看详情

将 DOCTYPE 添加到 Scala XML 的最简单方法?

】将DOCTYPE添加到ScalaXML的最简单方法?【英文标题】:SimplestwaytoaddDOCTYPEtoScalaXML?【发布时间】:2011-07-2608:27:30【问题描述】:如何在ScalaXML中制作这个最小的HTML5:&lt;!DOCTYPEhtml&gt;&lt;title&gt;&lt;/title&gt;&lt;p&... 查看详情

scala学习——元组&映射

...我们先来回顾一下映射&元祖映射是键/值对偶的集合,Scala有一个通用的叫法——元组,也就是n个对象的聚集,并不一定要相同类型的。对偶不过是一个n=2的元祖。元祖对于那种需要将两个或更多值聚集在一起特别有用。1、... 查看详情

从 Groovy 中的 URL 读取(使用重定向)

】从Groovy中的URL读取(使用重定向)【英文标题】:ReadfromURLinGroovy(withredirect)【发布时间】:2017-02-0416:41:49【问题描述】:这个Groovy代码输出一个空字符串:defurl=\'http://www.wikidata.org/w/api.php?action=wbgetentities&sites=enwiki&titles=M... 查看详情

Scala 运算符 #> 导致编译错误,但不是 &> - 为啥?

】Scala运算符#>导致编译错误,但不是&>-为啥?【英文标题】:Scalaoperator#>causescompilationerrorbutnot&>-why?Scala运算符#>导致编译错误,但不是&>-为什么?【发布时间】:2017-04-0821:03:00【问题描述】:我遇到了类... 查看详情

如何转义字符串以在 Scala 中的 XML/HTML 文档中使用?

】如何转义字符串以在Scala中的XML/HTML文档中使用?【英文标题】:HowtoescapeastringforuseinXML/HTMLdocumentinScala?【发布时间】:2013-06-2212:43:41【问题描述】:具体来说,在字符串中替换特殊XML字符的最简单和最惯用的方法是什么。例如... 查看详情

在 Java(或 Scala)中迭代 HashMap 的 HashMap

】在Java(或Scala)中迭代HashMap的HashMap【英文标题】:IteratingoveraHashMapofHashMapsinJava(orScala)【发布时间】:2011-03-1607:22:55【问题描述】:我创建了一个类Foo,它具有返回Array&lt;Int&gt;的方法toArray()。现在,我有一个HashMap将Strin... 查看详情

我如何使用 s & $ 访问 Pyspark 中的变量,就像在 Scala 中一样

】我如何使用s&$访问Pyspark中的变量,就像在Scala中一样【英文标题】:HowcaniaccessvariableinPysparkjustlikeinScalabyusings&$【发布时间】:2018-09-2514:47:44【问题描述】:我在下面有一个代码,用于将数据从HIVE表复制到HDFS,以附加模... 查看详情