关键词:
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<SomeObject,java.util.Collection<OtherObject>>我想将其转换为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支持&和&&。这两个运营商有区别吗?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:<!DOCTYPEhtml><title></title><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<Int>的方法toArray()。现在,我有一个HashMap将Strin... 查看详情
我如何使用 s & $ 访问 Pyspark 中的变量,就像在 Scala 中一样
】我如何使用s&$访问Pyspark中的变量,就像在Scala中一样【英文标题】:HowcaniaccessvariableinPysparkjustlikeinScalabyusings&$【发布时间】:2018-09-2514:47:44【问题描述】:我在下面有一个代码,用于将数据从HIVE表复制到HDFS,以附加模... 查看详情