一、概述
Scala中的模式匹配(case)类似于Java中的switch...case,但是Scala的模式匹配功能更为强大。通过模式匹配,可以匹配更复杂的条件和数据结构,包括常量、类型、集合、元组等。而 Java 的 switch
语句只能用于匹配整型或枚举类型。
二、基本语法
Java
java
public static void main(String[] args) {
String str = "a";
String ret = "";
switch (str) {
case "a":
ret = "A";
break;
case "b":
ret = "B";
break;
default:
ret = "else";
break;
}
System.out.println("ret=>"+ret);
}
Scala
Scala
value match {
case caseVal1 => returnVal1
case caseVal2 => returnVal2
...
case _ => defaultVal
}
Scala与Java的区别:
1、表达能力
Java 的
switch
语句只能用于匹配 整型 或 枚举类型。Scala 的 模式匹配(
case
)可以传入数组、元组、对象及样例类等类型,表达更为丰富2、返回值
Scala 中的
case
语句可以返回值,而 Java 的switch
语句不支持返回值。只能在 case 语句中通过赋值的方式实现返回值3、穿透
在 Java 中,
switch
语句的case
分支默认是穿透执行,即当满足某个分支条件时,会顺序执行后续所有分支,除非在分支中使用break
关键字显式跳出。而在 Scala 中,模式匹配的
case
分支默认是不会穿透执行的,只会匹配第一个满足条件的分支,并执行对应的代码块。4、列表匹配
Scala 的模式匹配可以直接匹配列表(List)和其他集合类型,使得匹配更加方便灵活。而Java无法做到这一点。
Scala
def matchExample(x: Any): String = x match {
case 1 => "One" // 匹配常量 1
case "two" => "Two" // 匹配字符串 "two"
case true => "True" // 匹配布尔值 true
case (a, b) => s"Tuple with values: $a and $b" // 匹配二元组
case list: List[Int] if list.nonEmpty => "Non-empty list of integers" // 匹配非空整数列表
case _ => "Other" // 默认情况
}
println(matchExample(1)) // 输出:One
println(matchExample("two")) // 输出:Two
println(matchExample(true)) // 输出:True
println(matchExample((10, 20))) // 输出:Tuple with values: 10 and 20
println(matchExample(List(1, 2, 3))) // 输出:Non-empty list of integers
println(matchExample("other value")) // 输出:Other
三、模式守卫
模式守卫(Pattern Guard)是 Scala 中模式匹配(Pattern Matching)的一个扩展特性。它允许在模式匹配的分支中添加更复杂的条件判断,以进一步过滤匹配的结果。
在模式守卫中,我们可以在 case
分支后面使用 if
关键字,并跟随布尔表达式来指定额外的条件。只有当被匹配的值满足该布尔表达式时,才会执行相应的代码块。