Scala语法(四) 模式匹配

2024-05-14 07:58
文章标签 语法 scala 模式匹配

本文主要是介绍Scala语法(四) 模式匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

Scala中的模式其实和Java中的switch类似. Scala中对于Java内的switch进行了扩展, 例如数组模式匹配、List模式匹配、偏函数等. 其功能要远远强于Java的简单的switch匹配.


正文

基本匹配

下方的例子中包含了多种模式匹配. 主要包括:

  • 字符串匹配
  • 混合数据类型匹配
  • 数组模式匹配
  • List模式类型
  • 元组模式匹配
import org.junit.Test
import scala.util.Random/*** Scala内的模式匹配.* * */
class CaseMatch {// 字符串匹配
//  @Testdef caseMatchString{// 定义需要匹配的数组val arr = Array("Sean","Abel","Bruce")// 随机指定一个字符串val name = arr(Random.nextInt(arr.length))println(name)name match{case "Sean" => println("Sean is a good people.")case "Abel" => println("Abel is a good gay.")case _ => println("default matches.")}}// 混合数据类型匹配
//  @Testdef caseMatchFix{val arr = Array("Sean",1.0,2)// 随机指定一个变量val variable = arr(Random.nextInt(arr.length))println(variable)variable match{case str:String  => if(str.equals("Sean")){println("String Sean.")}case num:Int => println("Int Number: "+num)case num:Double => println("Double Number"+num)case _ => throw new Exception("Not Match Exception.s")}}// 模式匹配数组类型
//  @Testdef caseMatchArray{val arr = Array(0,1,5)// _* 表示可以匹配任意多的参数arr match{case Array(1,x,y) => println(x+" "+y)case Array(0,1,5) => println("Only 0")case Array(0, _*) => println("0...")case _ => println("Something Else.")}}// 模式匹配List数据类型@Testdef caseMatchList{
//    val lst = List(0,3,111)val lst = List(0,3)// List包括2哥部分组成 (head,tail)// Nil 表示尾部是一个空的Listlst match{case 0 :: Nil => println("Only 0")// 加s字符串进行转义case x ::y::Nil => println(s"x: $x y:$y")// acase 0 :: a => println("0...")case _ => println("Something else.")}}// 模式匹配元组@Testdef caseMatchTuple{val tup = (6,3,5)tup match {case (1,x,y) => println(s" 1,$x,$y")case (_,z,5) => println(z)case _ => println("else")}}}
样例类与类模式匹配

样例类case class, 快速创建的类.其中, 会自动生成部分方法. 除了样本类之外, 还有样例对象case object.

// 上诉样例类可能不在一个文件内, 需要手动导入.
case class SubmitTask(id:String, name:String)
case class HeartBeatTask(time:Long)
case object CheckTimeoutTask

class CaseMatchClass {// 根据提交的任务进行模式匹配进行判断@Testdef caseMatch{// 样例类可以new, 也可以不new出来.val arr = Array(CheckTimeoutTask,HeartBeatTask(123),SubmitTask("0001","Task-001"))val obj = arr(Random.nextInt(arr.length))obj match{case SubmitTask(id,name) =>{println("SubmitTask.")}case HeartBeatTask(time) =>{println("HeartBeatTask.")}case CheckTimeoutTask => {println("CheckTimeoutTask.")}}}
  • Option类型匹配
    对于Map数据类型内的对象. 不确定内部对象是否存在. 我们在使用时也可以对其进行模式匹配. 但是个人还是推荐使用getOrElse(<>,<>)方法较为方便一点.
 // Option类型匹配@Testdef caseMatchOption{// Some是有值 None是否有值val map = HashMap(("a",1),("b",2))val v = map.get("b")v match {case Some(i) => icase None => println("Null")}// 同时也可以通过getOrElse来进行实现// getOrElse就是通过match方法进行实现的.val v2 = map.getOrElse("b", 0)}

Scala–样例类(case)详解

偏函数

所谓偏函数, 没有match, 只有case的一段语句块. 其需要书写成def caseMatchFunctionA1 : PartialFunction[Int,Int] ={}的形式.

// 偏函数@Testdef caseMatchFunctionA(num:Int) : Int = num match{case 1 => 1case 2 => 2case _ => -1}// 偏函数的写法 PartialFunction[输入参数类型,输出函数类型]@Testdef caseMatchFunctionA1 : PartialFunction[Int,Int] = {case 1 => 1case 2 => 2case _ => -1}@Testdef caseMatchFunctionB(str:String) : Int = str match{case "one" => 1case "two" => 2case _ => -1}
}

这篇关于Scala语法(四) 模式匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988194

相关文章

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

python基础语法十一-赋值、浅拷贝、深拷贝

书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 python基础语法四-数据可视化 python基础语法五-函数 python基础语法六-正则匹配 python基础语法七-openpyxl操作Excel python基础语法八-异常 python基础语法九-多进程和多线程 python基础语法十-文件和目录操作

python进阶篇-day07-高级语法与正则

day07-python其他高级语法 一. with(上下文管理) 介绍 概述 一个类只要实现了__ enter __ () 和 __ exit __ ()方法, 这个类就是一个上下文管理器类, 该类的对象 = 上下文管理器对象 目的 节约资源, 提高效率, 避免手动释放资源, 且出bug的时候, 也会自动尝试释放资源 特点 上下文管理器对象, 可以结合with语句使用

javaweb-day01-4(DTD 的语法)

XML 文件中 DOCTYPE 声明语句的格式: XML 文件使用 DOCTYPE 声明语句来指定它所遵循的 DTD 文件。 DOCTYPE声明语句有两种形式: 1.  当引用的约束文件在本地硬盘时,使用如下方式: <!DOCTYPE    xml文档根节点    SYSTEM    "dtd文档在本地的绝对路径或相对路径"> 例如:<!DOCTYPE 书架 SYSTEM "book

javaweb-day01-2(00:17:48 XML 的作用 和 语法)

XML: 描述 可扩展标记语言,w3c  2000年发布的 XML 1.0 版本规范。 用来描述数据之间的关系。 经常用作 软件  的配置文件,描述 模块与模块 之间的关系。 还用作    软件启动  的配置文件,描述 启动模块之间的 依赖 关系。 语法 一个XML文件分为如下几部分内容: 文档声明元素属性注释CDATA区、转义字符处