Scala 高阶:Scala中的模式匹配

news2024/11/25 12:32:07

一、概述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字符串函数----篇章(1)

目录 补上章缺失的两道题 七.笔试题(7) 八.笔试题(8) 一.字符串函数 ( 1 )----strlen函数 二.字符串函数 ( 2 )----strcpy函数 2-1模拟实现strcpy 三.字符串函数 ( 3 )----strcmp函数 ​编辑 3-1模拟实现strcmp 四.字符串函…

新建excel出现由于找不到vcruntime140_1.dll,无法继续执行代码。系统错误

打开excel报错,提示缺少​​vcruntime140_1D.dll​​。 那解决方法无疑就是找到这个​​DLL​​​,然后放到电脑系统中。 在网站​中搜索​vcruntime140_1.dll,下载 把你下载的文件放到系统中,把dll文件放到​​C:\Windows\Syst…

2、Window上的虚拟机暴露到宿主机局域网教程

今天在公司的服务器主机上捣鼓虚拟机,要在虚拟机上安装一个oracle,虚拟机和主机能互相ping通的前提下,要将虚拟机上的端口号暴露在主机上,让项目组内的所有员工的电脑都能访问到该oracle数据库。 也就是电脑A 访问主机&#xff0…

1997-2023年1月中国企业跨国并购数据Zephyr数据库

1997-2023年1月中国企业跨国并购数据 1、时间:1997-2023年1月 2、来源:根据Zephyr数据库整理形成 3、样本量:3.6万 4、指标:变量信息全面,包括交易的详细时间、金额、标的、介绍、行业等等具体如下: D…

再也不怕面试官拷打Go数据结构了!-Go语言map详解

map是Go语言中的哈希表,用来存储key/value键值对。可以在O(1)的时间复杂度内进行查找。map是Go语言在面试中经常会被问到的一个点,这篇文章就来细细梳理一下map的相关知识点,面试不再怕,offer顶呱呱。 哈希冲突 我们知道&#x…

【每日一题】74. 搜索二维矩阵

74. 搜索二维矩阵 - 力扣(LeetCode) 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返…

探索 Java JDK 21 的新特性:一场深度解析之旅

探索 Java JDK 21 的新特性:一场深度解析之旅 探索 Java JDK 21 的新特性:一场深度解析之旅摘要 🚀引言 🌐正文 📚新特性概览 🆕1. 模式匹配的魅力 🧩2. 记录类型:轻松管理数据 &…

【深度学习】ONNX模型多线程快速部署【基础】

【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…

王道考研计算机组成原理

王道考研计算机组成原理 计算机系统概述计算机系统层次结构计算机的性能指标错题 数据的表示和运算数制与编码运算方法和运算电路浮点数的表示与运算 存储系统存储器概述主存储器主存储器与CPU的连接外部存储器高速缓冲存储器虚拟存储器 指令系统指令格式指令的寻址方式程序的机…

js加密双重保障之sm2国密

前言 ​ 最近看到一些项目里边有用到sm2/3/4国密加密算法,这里给大家简单介绍一下。 知识科普 SM2(国密算法)是一种非对称加密算法,由中国国家密码管理局(NCC)制定,并被广泛应用于中国的信息…

9月21日作业

登录代码&#xff1a; widget.h #ifndef REGISTER_H #define REGISTER_H#include <QWidget> #include <QDebug> #include <QSqlDatabase> #include <QSqlQuery> #include <QMessageBox>namespace Ui { class Register; }class Register : publ…

selenium自动化测试-获取动态页面小说

有的网站页面是动态加载的资源&#xff0c;使用bs4库只能获取静态页面内容&#xff0c;无法获取动态页面内容&#xff0c;通过selenium自动化测试工具可以获取动态页面内容。 参考之前的"bs4库爬取小说工具"文章代码&#xff0c;稍微修改下&#xff0c;就可以转成获…

9.21号作业

实现把注册的信息导入数据库中 second.h #ifndef SECOND_H #define SECOND_H#include <QWidget> #include <QDebug> namespace Ui { class Second; }class Second : public QWidget {Q_OBJECT public:void newslot(); public:explicit Second(QWidget *parent n…

机器学习西瓜书+南瓜书吃瓜教程学习笔记第四章决策树

1、算法原理 从逻辑角度&#xff0c;一堆if else语句的组合 从集合角度&#xff0c;根据某种准则划分特征空间 最终目的&#xff1a;将样本越分越“纯” 决策树是基于树结构来进行决策的 例如&#xff0c;我们对“这是好瓜吗&#xff1f;”这样的问题进行决策时&#xff0c;通…

QTC++ day12

注册登录界面 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QPushButton> #include <QLineEdit> #include <QLabel> #include <QDebug> #include <QMessageBox>//消息对话框类 #inc…

tracert 路由追踪原理

一、概念 就是利用ICMP(Internet Control Message Protocol)Internet控制报文协议 来追踪的计算机到目标计算机之间的所有路由器信息 二、不同平台下命令方式 windows下&#xff1a; tracert www.baidu.comlinux下 traceroute www.baidu.com 三、基于方式 UDP(user datagram pr…

【建议收藏】5个神级AI提示词网站,让AI工具效率拉满

HI&#xff0c;同学们&#xff0c;我是赤辰&#xff0c;本期是赤辰第9篇AI工具类教程&#xff0c;文章底部准备了粉丝福利&#xff0c;看完可以领取&#xff01; 今天给大家推荐五款非常好玩的AI提示词资源网站&#xff0c;完全免费&#xff0c;无需魔法&#xff0c;直接复制粘…

DIY 一个汽车方向盘游戏外设(MMOS OSW DIY)

OSW-MMOS直驱方向盘DIY过程记录 - 简书 (jianshu.com) DIY 一个汽车方向盘游戏外设&#xff08;MMOS OSW DIY&#xff09; 首先讲一下这个直驱系统大概的框架&#xff0c;首先是电脑&#xff0c;电脑里装MMOS的软件(这个软件国内高手把它汉化了的)&#xff0c;电脑通过USB线&a…

行业首款数字牙刷 F10 系列:笑容加带来的智能刷牙革命

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…