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

相关推荐
闲敲棋子落灯华3 分钟前
java学习笔记(三)--java包的引入、访问控制、类的继承、super关键字、重载、重写、运算符、拆箱
java·后端
程序员岳焱5 分钟前
Java 使用 Spring AI 的 10 个实用技巧
java·后端·程序员
Jooolin10 分钟前
Flask 入门到实战(2):用 SQLAlchemy 优雅操作数据库
后端·flask·ai编程
Kapaseker11 分钟前
Android程序员初学Rust-通道
后端·rust
BingoGo13 分钟前
PHP 8.5 将带来什么 🚀
后端
coding随想14 分钟前
查找算法全解析:从顺序查找、折半查找到哈希查找
后端
Jooolin18 分钟前
Flask 入门到实战(2):使用 SQLAlchemy 打造可持久化的数据层
后端·flask·ai编程
虾球xz33 分钟前
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
开发语言·c++·物联网·学习
小远同学1 小时前
java Mavlink连接模拟器 开源软件Mission Planner简单使用(一)
后端
Jooolin1 小时前
Flask 入门到实战:手把手带你构建第一个 Python Web 应用
后端·flask·ai编程