Scala 模式匹配通过 match 关键字定义匹配主体,case 关键字定义分支,语法简洁且功能强大。
基本用法(类似 switch)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
val operator: Char = '*' val num1: Int = 10 val num2: Int = 2
// 匹配运算符,执行对应计算 val result = operator match { case '+' => num1 + num2 case '-' => num1 - num2 case '*' => num1 * num2 case '/' => num1 / num2 case _ => thrownewException("不支持的运算符") // 默认分支,类似 default }
println(result) // 输出:20
核心特点:
每个 case 分支通过 => 连接匹配条件和执行逻辑。
匹配成功后自动退出(无需 break),效率高于 Java 的 switch。
case _ 表示默认分支,匹配所有未被其他分支覆盖的情况。
与 Java switch 的区别
特性
Scala 模式匹配
Java switch
匹配类型
支持值、类型、集合、对象等
仅支持基本类型、枚举、字符串(Java 7+)
分支执行
自动退出(无需 break)
需要显式 break,否则穿透
返回值
整个 match 表达式有返回值
无返回值(需手动赋值)
默认分支
case _
default
类型匹配:根据数据类型分支
Scala 模式匹配可直接根据变量的运行时类型进行分支,无需显式调用 isInstanceOf。
示例:匹配不同类型
1 2 3 4 5 6 7 8 9 10 11
val elements: List[Any] = List(10, "hello", 3.14, true, 'a')
for (elem <- elements) { elem match { case i: Int => println(s"整数:$i") case s: String => println(s"字符串:$s") case d: Double => println(s"双精度浮点数:$d") case b: Boolean => println(s"布尔值:$b") case _ => println(s"未知类型:${elem.getClass.getSimpleName}") } }
for (d <- data) { d match { case i: Intif i > 10 => println(s"大于10的整数:$i") case s: Stringif s.length > 3 => println(s"长度大于3的字符串:$s") case _ => println(s"未匹配:$d") } }
输出结果:
1 2 3 4
大于10的整数:15 长度大于3的字符串:scala 未匹配:8.9 未匹配:-2
变量绑定:在匹配中提取值
case 后可直接声明变量,匹配成功后将值绑定到该变量,便于后续处理。
示例:提取字符并处理
1 2 3 4 5 6 7 8
val char: Char = 'a'
char match { case '+' => println("匹配到加号") case '-' => println("匹配到减号") case ch => println(s"其他字符:$ch(ASCII码:${ch.toInt})") // 绑定到变量 ch } // 输出:其他字符:a(ASCII码:97)
示例:结合类型的变量绑定
1 2 3 4 5 6 7
val obj: Any = "hello scala"
obj match { case s: String => println(s"字符串内容:$s,长度:${s.length}") // s 绑定字符串值 case i: Int => println(s"整数:$i") } // 输出:字符串内容:hello scala,长度:11
for (t <- tuples) { t match { case (0, s) => println(s"键为 0,值为:$s") case (k, "one") => println(s"值为 one,键为:$k") case (k, v) => println(s"键:$k,值:$v") } }