Scala 高阶:Scala中的模式匹配

一、概述

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 关键字,并跟随布尔表达式来指定额外的条件。只有当被匹配的值满足该布尔表达式时,才会执行相应的代码块。

相关推荐
JavaGuide1 分钟前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel11 分钟前
prisma 如何处理数据库竞态
前端·数据库·后端
Zhou14113622 分钟前
SpringSecurity_02_授权与高级功能
开发语言·python
码匠许师傅1 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http
小小小小钰儿2 小时前
1.5-Python网络编程
开发语言·网络·python·web安全·计算机·网络安全
hiahiahia1232 小时前
实现完整 Tool Dispatcher
开发语言·前端
IT_陈寒2 小时前
Java线程池这破玩意,差点让我周末加班排查到凌晨
前端·人工智能·后端
AC赳赳老秦3 小时前
公开音频转写信息提取:OpenClaw 处理发布会与听证会文本并提取核心决策信息
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw