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

相关推荐
shootero@126.com3 分钟前
R语言开发记录,一
开发语言·r语言
勤奋的知更鸟6 分钟前
Java 编程之状态模式
java·开发语言·状态模式
error_cn10 分钟前
unxz命令与版本控制集成
后端
Cache技术分享11 分钟前
124. Java 泛型 - 有界类型参数
前端·后端
一头小阿牛11 分钟前
一个生产环境线程池问题解决与调优实践
后端
tony_cto11 分钟前
pandora-cloud集成 AJ-Captcha行为验证码
后端
自由的疯12 分钟前
实现 PC 端前后分离微信二维码扫码登录全攻略
后端
Victor35612 分钟前
MySQL(116)如何监控负载均衡状态?
后端
houseme13 分钟前
RustFS: 高性能分布式对象存储的优雅之选
后端
沐知全栈开发15 分钟前
R 列表:深入解析与高效应用
开发语言