Scala学习(十二)---模式匹配

news2024/11/26 22:26:03

文章目录

  • 1.基本语法
  • 2.模式守卫
  • 3.匹配常量和类型
  • 4.匹配对象和样例类
      • 4.1 匹配对象
      • 4.2 匹配样例类
  • 5.偏函数中的模式匹配

1.基本语法

在Scala中的模式匹配类似于Java中的switch语法

//模式匹配基本语法
	val a=10
    val b=20
    val c="+"

    c match {
      case "+" =>println(a+b)
      case "-"=>println(a-b)
      case "/"=>println(a/b)
      case "*"=>println(a*b)
      case _=>println("没有匹配上边的情况")

运行结果
在这里插入图片描述

2.模式守卫

如果在模式匹配中想要表达匹配某个范围的数据,就需要在模式匹配中添加条件守卫。

    //返回整数的绝对值
    var d1= -3.14
    val d = d1 match {
      case d2: Double if d2 > 0 => d2
      case d2: Double if d2 <= 0 => -d1
      case _ => 0
    }
    println(d)

在这里插入图片描述

3.匹配常量和类型

在scala中可以通过模式匹配来匹配常量和类型。
如果不使用模式匹配来获取参数的类型的话,可以通过if和isInstanceOf

    //第一种方式,通过if
    def fun(x:Any)={
      if(x.isInstanceOf[String])
        {
          println("这是字符串")
        }
        if(x.isInstanceOf[Int])
          {
            println("这是整数")
          }
          if(x.isInstanceOf[Double])
            {
              println("这是浮点类型")
            }
    }

    fun("222")

下面是使用了模式匹配来获取参数的类型

    //通过模式匹配
    def fun(x:Any)={
      x match {
        case s:String=>{
          println("这是字符串")
        }
        case i:Int=>{
          println("这是整数")
        }
        case d:Double=>{
          println("这是浮点类型")
        }
        case _ => {
        println("其他")
      }
      }
    }
    fun("222")

在这里插入图片描述

4.匹配对象和样例类

4.1 匹配对象

在scala中也可以使用模式匹配来匹配对象,在匹配对象的时候,需要有类中有apply和unapply方法。

class Person14(val name:String,var age:Int){


}
object Person14{
  def apply(name: String, age: Int): Person14 = new Person14(name, age)

  //unapply方法 解析方法
  //就是将类的对象当成参数传入此方法中,用于获取对象创建的参数
  def unapply(arg: Person14): Option[(String, Int)] = {
    if(arg==null)
      {
        None
      }
      else
      {
        val tuple = (arg.name, arg.age)
        //将参数传入到包装类中返回
        Some(tuple)
      }
  }

测试方法中:

val person14 = Person14("zhangsan", 22)
    person14 match {
      case Person14("zhangsan",22) =>println("找到zhangsan")
      case _ => println("其他情况")
    }

Scala中 unapply方法和 apply 方法相反,
apply是传递一个参数生成一个类, Unapply方法是 根据传递的类 获取参数,逆向的过程
上述代码中引入了包装类,option、some、None。其中some和None为option的子类,如果值为空,就将None返回,如果值不为空,就将值传入到Some中返回。
在这里插入图片描述

4.2 匹配样例类

什么是样例类?
1.样例类仍然是类,和普通类相比,只是其自动生成了伴生对象,并且伴生对象中自动提供了一些常用的方法,比如:apply,unapply,toString,equals,hashCode和copy方法
2.样例类是为模式匹配而优化的类,因为默认提供了unapply方法,因此样例类可以直接使用模式匹配,无需自己实现unapply方法
3.构造器中每一个参数都是val。

5.偏函数中的模式匹配

偏函数也是函数的一种,通过偏函数我们可以方便的对输入参数做更精确的检查。
偏函数的诞生就是为了方便模式匹配,例如:该偏函数的输入类型为List[Int],我们需要的是第一个元素是0的集合,这种就是通过模式匹配来实现的。
偏函数自动实现了filter和map方法。

    //1.偏函数的复杂写法
    val partialFun = new PartialFunction[List[Int], Int] {
      //偏函数在什么情况使用
      override def isDefinedAt(x: List[Int]): Boolean = {
        x match {
          case List(x, y, _*) => true //在这种情况下使用偏函数
          case _ => false //其他情况下不使用
        }
      }

      //偏函数怎么用
      override def apply(v1: List[Int]): Int = {
        v1 match {
          case List(x, y, _*) => y
        }
      }
    }
    //2.偏函数简单写法
    val parFunc1: List[Int] => Int = (list: List[Int]) => list match {
      case List(x, y, _*) => y
    }


    //通过collect方法调用偏函数
    val list2 = List(List(1, 2, 3, 4), List(1), List(5, 6))
    val list3 = list2.collect({
      case List(x, y, _*) => y
    })
    val list4 = list2.collect(partialFun)

    println(list3)
    println(list4)

运行结果:
在这里插入图片描述

需求:使用偏函数来改变一个二元组

//第一种方式,可以使用map方法来对二元组进行改造
    val list5 = List(("hello", 1), ("world", 2))
    //使用map方法来改造二元组
    val mapChange = list5.map((tuple: (String, Int)) => {
      (tuple._1 + "111", tuple._2 + 1)
    })
    print(mapChange)
//第二种方式,就是使用偏函数来实现对二元组的改造
    val parChange = list5.collect({
      case (key, value) => (key + "111", value + 1)
    })

    println(parChange)

运行结果:
在这里插入图片描述

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

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

相关文章

VScode远程连接虚拟机(ubuntu系统)

文章目录 1. Windows端安装VScode2. 安装远程登录插件3. 配置Remote-SSH插件关于关闭后如何打开该配置文件 4. 测试ubuntu与windows可否ping通5. 在Ubuntu中安装 SSH1.检查是否安装ssh-server2.安装openssh-server3.查看ssh服务是否启动4.Ubuntu中配置openssh-server开机自动启…

路径规划算法:基于蝠鲼觅食优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于蝠鲼觅食优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于蝠鲼觅食优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

6.4下周黄金最新行情走势分析及开盘交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(6月2日)&#xff0c;美市尾盘&#xff0c;现货黄金收报1947.82美元/盎司&#xff0c;大幅下跌29.70美元或1.50%&#xff0c;日内最高触及1983.43美元/盎司&…

chatgpt赋能python:Python升序排序

Python升序排序 Python是一种非常强大的编程语言&#xff0c;它在数学计算、数据处理等方面具备很强的优势。在实际应用中&#xff0c;我们经常需要对一系列数据进行排序。而在Python中&#xff0c;升序排序是非常常见的操作。本篇文章将介绍在Python中如何使用ifelse进行升序…

JavaWeb13(ajax01 AJAX介绍AJAX登陆AJAX加入购物车AJAX修改购物车商品数量)

目录 一. 什么是ajax 二.为什么需要AJAX? 三. 同步和异步的区别. 四.基于jQuery实现AJAX语法 4.1 语法1-$.ajax(url,[settings]). 4.1 语法2-$.get/post(url, [data], [callback], [type]). 五 .案例 5.1 ajax实现登录 ①html代码 用户登录 用户名&#xff1a; 密码…

【无功优化】基于改进教与学算法的配电网无功优化【IEEE33节点】(Matlab代码时候)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

揭秘照片修复技巧:手把手教你如何让模糊照片变清晰

作为一名修图小能手&#xff0c;行走于修图界&#xff0c;修复模糊的照片是必备的技能之一&#xff0c;最近收到很多粉丝的私信&#xff0c;清一色都是问的怎么免费把照片变清晰&#xff0c;为了给各位小伙伴们解决难题&#xff0c;我决定拿出我私藏多年的秘密武器&#xff0c;…

【CloudCompare教程】016:计算点云的法向量

本文讲解CloudCompare计算点云的法向量的方法。 文章目录 一、法向量概述二、法向量计算1. 平面法向量2. 二次曲面3.三角网格化一、法向量概述 法向量,是空间解析几何的一个概念,垂直于平面的直线所表示的向量为该平面的法向量。法向量适用于解析几何。由于空间内有无数个直…

HAL库记录-RTC

芯片:STM32F29IIGT6 阿波罗开发板 1.配置时钟 2.HAL外设配置 3.代码解析 生成rtc文件 RTC_HandleTypeDef hrtc;/* RTC init function */ void MX_RTC_Init(void) {/* USER CODE BEGIN RTC_Init 0 */RTC_TimeTypeDef rtc_time;RTC_DateTypeDef rtc_data;/* USER CODE END RTC…

node笔记_生成自定义目录文件

文章目录 ⭐前言⭐node生成目录&#x1f496; mkdirSync创建目录&#x1f496; stat判断目录是否存在&#x1f496; mkdir创建目录&#x1f496; 动态创建目录文件 ⭐结束 ⭐前言 大家好&#xff01;我是yma16&#xff0c;本文分享node生成自定义目录文件。 背景&#xff1a; …

chatgpt赋能python:Python中去掉数字末尾的0:一种简单有效的方法

Python中去掉数字末尾的0&#xff1a;一种简单有效的方法 Python作为一种流行的编程语言&#xff0c;经常被用于各种应用程序的编写。在这篇文章中&#xff0c;我们将介绍如何使用Python去掉数字末尾的零的一种简单有效的方法。 为什么要去掉数字末尾的0&#xff1f; 对于数…

【工具使用】STM32CubeMX-GPIO配置

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片的GPIO的配置及其相关知识。GPIO…

(转载)基本粒子群算法及惯性权重分析(matlab实现)

1 理论基础 粒子群算法(particle swarm optimization,PSO)是计算智能领域&#xff0c;除了蚁群算法、鱼群算法之外的一种群体智能的优化算法。该算法最早由Kennedy和Eberhart在1995年提出的。PSO算法源于对鸟类捕食行为的研究&#xff0c;鸟类捕食时&#xff0c;找到食物最简单…

一零五九、Windows系统(amd)通过VMware安装黑苹果

我来详细的说一下过程&#xff1a; 配置&#xff1a; windows amd锐龙VMware 16.0 &#xff08;16.1.0 build-17198959&#xff09;macos 11.1unlocker(工具&#xff0c;让虚拟机支持引导苹果系统) 总体步骤&#xff1a; 下载iso镜像和unlocker工具,这里提供两个链接&#…

Spring Cloud Alibaba Nacos 构建配置中心

构建配置中心 新建命名空间 登录 Nacos 面板&#xff0c;依次点击左侧菜单栏【命名空间→新建命名空间】、填写命名空间名和描述信息&#xff0c;点击【确定】&#xff1a; 新建配置文件 依次点击左侧菜单栏【配置管理→配置列表】、切换到指定命名空间【此处为 shop】、点击…

MySQL中的CONCAT()函数和CONCAT_WS()函数

一、介绍 1. CONCAT() MySQL的CONCAT()函数用于将多个字符串连接在一起。它接受两个或多个字符串参数&#xff0c;并返回它们的连接结果。 示例&#xff1a; select concat("hello"," ","world") as concatenated_str; 执行结果&#xff1a…

基于SpringBoot的爱心家园服装捐赠系统

目录 1、项目介绍 2、项目技术 3、运行环境 4、项目介绍 5、项目代码 5、运行截图 6、源码获取 1、项目介绍 角色:管理员、用户 管理员:管理员登录系统后&#xff0c;可以对首页、个人中心、用户管理、捐赠记录管理、论坛管理、留言管理、心愿管理等功能进行相应的操作…

二、KeilMDK+STM32CubeMX建立工程_LED灯闪烁为例

1、开发环境 (1)KeilMDK&#xff1a;V5.38.0.0 (2)STM32CubeMx:V6.8.1 (3)MCU:STM32F407ZGT6 2、实验目的&原理图 2.1、实验目的 实现两个LED灯以500毫秒闪烁一次。 2.2、原理图 (1)LED阴极接GPIO&#xff0c;GPIO输出低电平&#xff0c;LED点亮&#xff1b;GPIO输…

【Python】列表 List ② ( 使用下标索引访问列表 | 正向下标索引 | 反向下标索引 | 嵌套列表下标索引 | 下标索引越界错误 )

文章目录 一、使用下标索引访问列表1、下标索引用法2、正向下标索引3、反向下标索引4、代码示例 - 列表下标索引基本用法 二、嵌套列表下标索引1、嵌套列表下标索引简介2、代码示例 - 嵌套列表下标索引 三、下标索引越界错误 一、使用下标索引访问列表 1、下标索引用法 在 Pyth…

java SSM 宠物寄养管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM 宠物寄养管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…