Scala 高阶:Scala中的模式匹配

2023-09-18 10:53:30

一、概述

Scala中的模式匹配(case)类似于Java中的switch...case,但是Scala的模式匹配功能更为强大。通过模式匹配,可以匹配更复杂的条件和数据结构,包括常量、类型、集合、元组等。而 Java 的 switch 语句只能用于匹配整型或枚举类型。

二、基本语法

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

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无法做到这一点。

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

更多推荐

6.3 应用动态内存补丁

动态内存补丁可以理解为在程序运行时动态地修改程序的内存,在某些时候某些应用程序会带壳运行,而此类程序的机器码只有在内存中被展开时才可以被修改,而想要修改此类应用程序动态补丁将是一个不错的选择,动态补丁的原理是通过CreateProcess函数传递CREATE_SUSPENDED将程序运行起来并暂停,此时程序会在内存中被

【LeetCode题目详解】第十章 单调栈part03 84.柱状图中最大的矩形(day60补)

本文章代码以c++为例!一、力扣第84题:柱状图中最大的矩形题目:给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例1:输入:heights=[2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为10示例2:输入:hei

前端自定义导出PPT

1、背景前端导出PPT,刚接触这个需求,还是比较懵逼,然后就在网上查找资料,最终确认是可行的;这个需求也是合理的,我们做了一个可视化数据报表,报表导出成PPT,将在线报表转成文档类型留存;2、技术方案实现这种复杂的功能,都得依赖前辈匠人,还好有一个比较完善好用的库:pptxgenjs只有英文文档:QuickStartG

代码大全阅读随笔(七)

循环控制循环控制会出现什么样的错误,任何一种答案都可以归结到下面所说的问题之一:忽略或者错误的对循环执行初始化,忽略了对累加变量或者其他与循环有关变量执行初始化,不正确的嵌套,不正确的循环终止,忽略或者错误的增加了循环变量的值,以及用不正确的循环下标访问数组元素等等。要点:循环很复杂。保持循环简单将有助于别人阅读你的代

Linux下的buff/cache

目录一、buff/cache二、buff/cache与内存管理三、buff/cache对系统性能的影响四、优化buff/cache1、调整vm.dirty_ratio和vm.dirty_background_ratio2、配置vm.swappiness3、配置vm.vfs_cache_pressure五、释放buff/

5G相关信息

5G(第五代移动通信技术)是一种高级的通信技术,包括了多种算法和协议,用于实现高速、低延迟、可靠的无线通信。要实现5G算法,需要深入了解各种子系统和协议的工作原理,并根据需要编写相应的代码。以下是一些与5G相关的核心算法和技术,以及简要的描述:1.**OFDM(OrthogonalFrequencyDivisionMu

【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )

文章目录一、Socket套接字简介1、Socket套接字概念2、Socket套接字类型3、Socket套接字使用步骤4、Socket套接字服务端与客户端二、Socket服务端与客户端开发1、服务端2、客户端3、执行结果一、Socket套接字简介1、Socket套接字概念Socket套接字是一种进程之间的通信机制,通过套

人工智能安全-2-非平衡数据处理(2)

5算法层面代价敏感:设置损失函数的权重,使得少数类判别错误的损失大于多数类判别错误的损失;单类分类器方法:仅对少数类进行训练,例如运用SVM算法;集成学习方法:即多个分类器,然后利用投票或者组合得到结果。6代价敏感算法6.1相关问题经典分类方法一般假设各个类别的错分代价是相同的,并且以全局错分率最低为优化目标。以入侵检

Observability:使用 OpenTelemetry 手动检测 Go 应用程序

作者:LucaWintergerstDevOps和SRE团队正在改变软件开发的流程。DevOps工程师专注于高效的软件应用程序和服务交付,而SRE团队是确保可靠性、可扩展性和性能的关键。这些团队必须依赖全栈可观察性解决方案,使他们能够管理和监控系统,并确保问题在影响业务之前得到解决。整个现代分布式应用程序堆栈的可观察性

SpringBoot接受请求参数

1.简单参数1.1原始方法说明:获取请求传来的name参数,age参数的值。//简单方式@RestControllerpublicclassRequestController{@GetMapping("/books")publicStringsimpleParam(HttpServletRequestrequest){

Java 基础学习总结(207)—— 具有革命性、未来性、开创新纪元的 JDK 21, 它来了

具有革命性、未来性、开创新纪元的JDK21按照官方的时间计划表,今天终于是要正式GA了:https://openjdk.org/projects/jdk/21/GA,就是我上面框起来的“GeneralAvailability”的缩写,直译成中文,虽然是“普通可用”的意思,但是在软件行业,它就代表正式版。如果对外发布一个

热文推荐