第8章 模式匹配

news2024/11/15 8:57:38

第8章 模式匹配

  1. 基本概念和用法

    image

  2. 模式守卫

    image

    package chapter08
    
    object Test01_PatternMatchBase {
      def main(args: Array[String]): Unit = {
        // 1. 基本定义语法
        val x = 5
        val y = x match {
          case 1 => "one"
          case 2 => "two"
          case 3 => "three"
          case _ => "other"
        }
        println(y)
    
        // 2. 示例:用模式匹配实现简单的二元运算
        val a = 25
        val b = 13
    
        def matchDualOp(op: String) = {
          op match {
            case "+" => a + b
            case "-" => a - b
            case "*" => a * b
            case "/" => a / b
            case "%" => a % b
            case _ => "非法运算符"
          }
        }
    
        println(matchDualOp("%"))
        println(matchDualOp("-"))
        println(matchDualOp("/"))
        println(matchDualOp("\\"))
    
        // 3. 模式守卫
        // 求一个整数的绝对值
        def abs(num: Int) = {
          num match {
            case i if i >= 0 => i
            case i if i < 0 => -i
          }
        }
    
        println(abs(19))
        println(abs(-109))
      }
    
    }
    
    
  3. 模式匹配的不同用法

    package chapter08
    
    object Test02_MatchTypes {
      def main(args: Array[String]): Unit = {
    
        // 1. 匹配常量
        def describeConst(x: Any) = {
          x match {
            case 1 => "Int one"
            case "hello" => "String hello"
            case true => "Boolean hello"
            case '+' => "Char +"
            case _ => "" // 不能省略,否则匹配不上时,报Match Error
            //        case abc => "" // 和case _ 等价
          }
        }
    
        println(describeConst("hello"))
        println(describeConst('+'))
        println(describeConst(0.3))
    
        // 2. 匹配类型
        println("================2. 匹配类型================")
    
        def describeType(x: Any): String = {
          x match {
            case i: Int => s"Int $i"
            case s: String => s"String $s"
            case list: List[String] => s"List String $list"
            case array: Array[Int] => s"Array Int ${array.mkString("---")}"
            case a => s"Something else ${a}"
    
          }
        }
    
        /**
         * ================2. 匹配类型================
         * Int 2
         * String hello
         * List String List(hello, world)
         * List String List(1, 2)
         * Array Int 1---2
         * Something else [Ljava.lang.String;@7a0ac6e3
         */
    
        println(describeType(2))
        println(describeType("hello"))
        println(describeType(List("hello", "world")))
        println(describeType(List(1, 2))) // 由于jvm里面有泛型擦除,只能判断当前类型为List类型,里面的泛型会被擦除,可以匹配List String,
        println(describeType(Array(1, 2))) // array 没有泛型擦除
        println(describeType(Array("hello world")))
    
    
        // 3. 匹配数组
        println("================3. 匹配数组================")
    
        /**
         * 0
         * Array(1, 0)
         * 以0开头的数组
         * 中间为1的三元素数组
         * Something else
         * Array hello,20
         */
        for (arr <- List(
          Array(0),
          Array(1, 0),
          Array(0, 1, 0),
          Array(1, 1, 0),
          Array(2, 3, 7, 15),
          Array("hello", 20)
        )) {
          val result = arr match {
            case Array(0) => "0"
            case Array(1, 0) => "Array(1, 0)"
            // 匹配只有两个变量的Array
            case Array(x, y) => s"Array ${x},${y}" // 匹配两元素数组
            case Array(0, _*) => s"以0开头的数组" // 匹配以0开头的数组
            case Array(x, 1, z) => s"中间为1的三元素数组" // 匹配中间为1的三元素数组
            case _ => "Something else"
          }
          println(result)
        }
    
        // 4. 匹配列表
        // 方式1
        println("================4. 匹配列表================")
        for (list <- List(
          List(0),
          List(1, 0),
          List(0, 1, 0),
          List(1, 1, 0),
          List(2, 3, 7, 15),
          List("hello", 20)
        )) {
          val result = list match {
            case List(0) => "0"
            case List(1, 0) => "List(1, 0)"
            case List(x, y) => s"List ${x},${y}" // 匹配两元素列表
            case List(0, _*) => s"以0开头的列表" // 匹配以0开头的列表
            case List(x, 1, z) => s"中间为1的三元素列表" // 匹配中间为1的三元素列表
            case _ => "Something else"
          }
          println(result)
        }
    
        // 方式2
        val list1 = List(1, 2, 5, 7, 24)
        val list = List(24)
        println(list)
        list match {
          case first :: second :: rest => println(s"first: $first, second: $second, rest:$rest")
          case _ => println("Something else")
        }
    
        // 5. 匹配元组
        println("================5. 匹配元组================")
    
        /**
         * 0, 1
         * 1, 0
         * (a, 1, _)0
         * (a, 1, _)0
         * (x, y, z)
         * (x, y, z)
         */
        for (tuple <- List(
          (0, 1),
          (1, 0),
          (0, 1, 0),
          (0, 1, 1),
          (1, 23, 56),
          ("hello", true, 0.5)
        )) {
          val result = tuple match {
            case (a, b) => s"${a}, ${b}"
            case (0, _) => "(0, _)"
            case (a, 1, _) => s"(a, 1, _)" + a
            case (x, y, z) => s"(x, y, z)"
            case _ => "Something else"
          }
          println(result)
        }
    
        // 元组匹配扩展
        // 5.1 在变量声明时,匹配
        /**
         * x: 10, y: hello
         * first: 23, second: 15
         * first: 23, second: 15, rest: List(9, 78)
         */
        val (x, y) = (10, "hello")
        println(s"x: ${x}, y: ${y}")
    
        //    val List(first,second,rest) = List(23,15,9,78) // error,需要使用val fir :: sec :: rest = List(23, 15, 9, 78)
        val List(first, second, _*) = List(23, 15, 9, 78)
        println(s"first: $first, second: ${second}")
    
        val fir :: sec :: rest = List(23, 15, 9, 78)
        println(s"first: $fir, second: ${sec}, rest: ${rest}")
    
        // 5.1 for 推导式中进行模式匹配
        val list5: List[(String, Int)] = List(("a", 23), ("b", 13), ("c", 9), ("d", 78), ("a", 13))
    
        // 直接打印
        /**
         * a 23
         * b 13
         * c 9
         * d 78
         * a 13
         */
        for (elem <- list5) {
          println(elem._1 + " " + elem._2)
        }
    
        // 将list中元素直接定义为元组,对变量赋值
        /**
         * word: a, count: 23
         * word: b, count: 13
         * word: c, count: 9
         * word: d, count: 78
         * word: a, count: 13
         */
        for ((word, count) <- list5) {
          println(s"word: $word, count: $count")
        }
    
        // 可以不考虑某个位置的变量,只遍历key或者value
        /**
         * word: a
         * word: b
         * word: c
         * word: d
         * word: a
         * count: 23
         * count: 13
         * count: 9
         * count: 78
         * count: 13
         */
        for ((word, _) <- list5) {
          println(s"word: $word")
        }
    
        for ((_, count) <- list5) {
          println(s"count: $count")
        }
    
        // 可以指定某个位置的值必须是多少
        /**
         * word: a , count: 23
         * word: a , count: 13
         */
        for (("a", count) <- list5) {
          println(s"word: a , count: $count")
        }
    
    
        // 6. 匹配对象
        println("================6. 匹配对象================")
    
    
      }
    
    }
    
    
  4. 匹配对象

    package chapter08
    
    object Test04_MatchObject {
      def main(args: Array[String]): Unit = {
        val student = new Student("alice", 19)
    
        // 根据对象实例的内容进行匹配
        val result: String = student match {
          case Student("alice", 18) => "Alice 18"
          case _ => "Else"
        }
    
        println(result)
      
      }
    
    }
    
    // 定义类
    class Student(val name: String, val age: Int)
    
    // 定义伴生对象
    object Student {
      def apply(name: String, age: Int): Student = {
        new Student(name, age)
      }
    
      // 必须实现一个unapply,实现对对象属性的拆解
      def unapply(student: Student): Option[(String, Int)] = {
        if (student == null) {
          None
        } else {
          Some(student.name, student.age)
        }
      }
    }
    
    
    package chapter08
    
    object Test05_MatchCaseClass {
      def main(args: Array[String]): Unit = {
        val student = Student1("alice", 18)
    
        // 根据对象实例的内容进行匹配
        val result: String = student match {
          case Student1("alice", 18) => "Alice 18"
          case _ => "Else"
        }
    
        println(result)
      }
    
    }
    
    
    // 定义样例类
    case class Student1(name: String, age: Int)
    
    
  5. 偏函数

    image

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

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

相关文章

《Reinforcement Learning: An Introduction》第6章笔记

Chapter 6 Temporal-Difference Learning If one had to identify one idea as central and novel to reinforcement learning, it would undoubtedly be temporal-difference (TD) learning. 时序差分学习&#xff08;temporal-difference (TD) learning&#xff09;组合了Mon…

PID控制算法 – 0、PID原理

1、开局一张图 很多地方都觉得PID的控制结构示意图是这样的&#xff1a; 2、目标值&#xff08;Setpoint&#xff09;、输入值&#xff08;Input&#xff09;、误差&#xff08;Error&#xff09; 其实把上图那个输入改为目标值&#xff08;Setpoint&#xff09;更合适&#…

canvas详解08-基本动画

由于我们是用 JavaScript 去操控 canvas 对象,这样要实现一些交互动画也是相当容易的。在本章中,我们将看看如何做一些基本的动画。 可能最大的限制就是图像一旦绘制出来,它就是一直保持那样了。如果需要移动它,我们不得不对所有东西(包括之前的)进行重绘。重绘是相当费…

CoreMark 跑个分:OrangePi5 RK3588S

一、 Orange Pi 5 简介 Orange Pi 5 采用了瑞芯微 RK3588S 新一代八核 64 位处理器&#xff0c;具体为四核A76四核A55&#xff0c;采用了 8nm 工艺设计&#xff0c;主频最高可达 2.4GHz&#xff0c;集成 ARM Mali-G610 MP4 GPU&#xff0c;内嵌高性能 3D 和 2D 图像加速模块&am…

【python桌面应用设计】tkinter库 01. Tkinter程序设计思想和结构(保姆级代码注释)

目录 实现思路代码实战简单的基础结构示例稍微丰富一点的示例 总结 『python图形化GUI界面设计』分享tkinter库、PyQt5库、wxPython库等相关的新手入门教程&#xff0c;目标是编写python程序时可以给程序一个可视化界面。 欢迎关注 『python桌面应用设计』 系列&#xff0c;持续…

ubuntu18.04安装ORBSLAM2

最近倒腾了一下旧项目&#xff0c;发现之前的环境不知道抽了什么风&#xff0c;直接不能用了&#xff0c;好吧&#xff0c;索性从头装过。 一、第三方库 主要包括Pangolin 、 OpenCV 、 Eigen g2o 与 DBoW2在ORB-SLAM2里面自带可以不需要自己搞 # 更新apt库,更新软件列表 su…

七、c++学习(加餐3:深入分析类和对象(下))

我们把这篇《深入分析类和对象》分为两篇&#xff0c;就是为了简化一下大家学习的压力&#xff0c;现在我们接下来看下一篇。 C学习&#xff0c;b站直播视频 文章目录 7.1 对象操作7.1.1 对象拷贝7.1.1.1 无拷贝赋值运算符7.1.1.2 测试编译器会不会自动生成7.1.1.3 自己写拷贝…

【吃透网络安全】2023软考网络管理员考点网络安全(四)防火墙详解

涉及知识点 什么是防火墙&#xff1f;防火墙的概念及定义&#xff0c;防火墙的优缺点&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 后面还有更多续篇希望大家能给个赞哈&#xff0c;这边提供个快捷入口&#xf…

Reactive 环境配置 遇到的问题记录

问题&#xff1a;Watchman: watchman--no-pretty get-sockname returned with exit code 1 ERROR: Unknown option --no-pretty 解决方案&#xff1a;运行ReactNative工程watchman运行错误 解决过程就是&#xff0c;我的watchman 没安装好&#xff0c;于是卸载&#xff0c;重新…

电子电气架构 —— OEM关于DTC具体实现相关见解

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我们当前遇到的几乎所有的成长问题都可以归结道目光短浅、及时满足的天性上,不过在现代社会,用避难趋易和急于求成来指代他们更贴切。 本文主要讲…

Vivado使用技巧之外部编辑器配置

目录 一、前言 二、编辑器配置 2.1 环境变量添加 2.2 环境变量验证 2.3 Vivado设置 2.4 配置验证 2.5 解决Vivado配置失败问题 一、前言 Vivado自带的默认编辑器功能受限&#xff0c;不如第三方编辑器Eclipse&#xff0c;Notepad&#xff0c;Sublime功能强大。因此&…

Python基础篇(八):文件和os、shutil模块

文件和os、shutil模块 1. 文件1.1 打开文件1.2 写入文件1.3 读取文件内容1.4 关闭文件1.5 异常处理 2. os模块2.1 获取当前工作目录2. 创建目录2.3 重命名文件或目录2.4 删除文件2.5 执行系统命令 3. shutil模块3.1 复制文件3.2 移动文件3.3 复制目录&#xff08;包括子目录和文…

【Linux】死锁(更新中)

文章目录 一. 什么是死锁二. 死锁产生的四个条件三. 避免死锁1. 死锁检测算法2. 银行家算法 结束语 一. 什么是死锁 死锁是指一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用的不会释放的资源&#xff0c;而处于一种永久等待的状态。 就像…

Elasticsearch是什么,如何学习Elasticsearch,整合SpringBoot

目录 一、是什么Elasticsearch 二、Elasticsearch&#xff0c;整合SpringBoot 三、Elasticsearch的优势和应用场景 一、是什么Elasticsearch Elasticsearch是一个开源的搜索引擎&#xff0c;它采用Java语言编写&#xff0c;使用Lucene作为核心搜索引擎&#xff0c;并在其基…

2.文本分析

目录 1. 词频统计--语料库的构建 1. 词频统计–语料库的构建 文本挖掘&#xff1a;将文本信息转换为可利用的知识。通常&#xff0c;对大量文件的归类&#xff0c;一般通过建立不同的文件夹&#xff0c;来保存不同的文章。 同样的&#xff0c;将需要分析的【文本文件】读取到…

Shell - 01_shell的概述

一、shell 概述 1.shell 的两层含义&#xff1a; 既是一种应用程序,又是一种程序设计语言 a.作为应用程序&#xff1a; 交互式地解释、执行用户输入的命令&#xff0c;将用户的操作翻译成机器可以识别的语言&#xff0c;完成相应功能。称之为 shell 命令解析器。shell 是用户和…

机器学习对风险管理的重要性

✏️写作&#xff1a;个人博客&#xff0c;InfoQ&#xff0c;掘金&#xff0c;知乎&#xff0c;CSDN &#x1f4e7;公众号&#xff1a;进击的Matrix &#x1f6ab;特别声明&#xff1a;原创不易&#xff0c;未经授权不得转载或抄袭&#xff0c;如需转载可联系小编授权。 机器学…

logback-spring.xml详解

本文来写说下logback-spring.xml相关的知识与概念 文章目录 概述configuration元素定义上下文名称定义变量appender组件 概述 对于xml日志文件的配置&#xff0c;大多数人第一次接触时有一种望而生畏的感觉&#xff0c;其实如果仔细分析&#xff0c;会发现核心的部分只有三个元…

【黄啊码】为什么程序员大都鄙视php?

“PHP 是世界上最好的语言”。。。“吗”&#xff1f;相信很多人跟我一样&#xff0c;都会在后边打个问号。这些年以来&#xff0c;“PHP 已死”、“PHP 行将消亡”之类的言论甚嚣尘上&#xff0c;由此看得出&#xff0c;很多开发人员讨厌 PHP。这又是为什么呢&#xff1f;PHP …

Nginx配置https证书遇到的一个问题

前言 今天在给一个站点配置 HTTPS 证书的时候&#xff0c;遇到了一个问题&#xff0c;写此文章记录一下解决过程。 环境 Ubuntu 22.04 Nginx 1.18 过程 今天给一个站点申请了 HTTPS 证书&#xff0c;然后在 Nginx 中进行配置&#xff0c;Nginx 的 SSL 配置如下&#xff1a…