Scala-模式匹配

这篇具有很好参考价值的文章主要介绍了Scala-模式匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模式匹配

简介

  • 类似于java中switch

  • 当数据满足某一个分支时,执行完毕后,就直接跳出

  • case分支类似于default语言, 分支匹配其实就是顺序匹配

  • 如果数据没有匹配任何规则,会发生错误

    //        val age = 20
    //
    //        age match {
    //            //case _ => println("other")
    //            case 10 => println("age = 10")
    //            case 30 => println("age = 30")
    //        }
    
            var a: Int = 10
            var b: Int = 20
            var operator: Char = '+'
    
            var result = operator match {
                case '+' => a + b
                case '-' => a - b
                case '*' => a * b
                case '/' => a / b
                case _ => "illegal"
            }
    

匹配规则

匹配常量

def describe(x: Any) = x match {
    case 5 => "Int five"
    case "hello" => "String hello"
    case true => "Boolean true"
    case '+' => "Char +"
}

匹配类型

  • 类型前增加变量名称,这个变量就是将数据转换成指定类型的变量
  • 如果想要使用下划线代表的数据,可以给下划线起名来使用
def describe(x: Any) = x match {
    case i : Int => i + 10
    case s : String => "String hello"
    case m: List[_] => "List"
    case c: Array[Int] => "Array[Int]"
    case someThing => "something else " + someThing
}
  • scala中类型匹配时,是不考虑泛型的,但是Array类型是特殊的。

    • 类型匹配注意

      Array[Int], 这里的Int不是真正的泛型

      java中的写法 => String[]
      scala中的写法 => Array[String]

      Array[Int] 是一个整体

      List[Int] 是类型加泛型

      不考虑泛型演示

      case m: List[Int] => "List"
      println(describe(List("1", "2", "3"))) ==>  List  
      case m: List[string] => "List"
      println(describe(List(1, 2, 3)))  ==>  List 
      

匹配数组

        for (arr <- Array(
            Array(0),
            Array(1, 0),
            Array(0, 1, 0),
            Array(1, 1, 0),
            Array(1, 1, 0, 1),
            Array("hello", 90))) { // 对一个数组集合进行遍历
            val result = arr match {
                case Array(0) => "0" //匹配Array(0) 这个数组
                case Array(x, y) => x + "," + y //匹配有两个元素的数组,然后将将元素值赋给对应的x,y
                case Array(0, _*) => "以0开头的数组" //匹配以0开头和数组
                case _ => "something else"
            }
            println("result = " + result)
        }
        
        result = 0
        result = 1,0
        result = 以0开头的数组
        result = something else
        result = something else
        result = hello,90

匹配列表

        for (list <- Array(
            List(0),
            List(1, 0),
            List(0, 0, 0),
            List(1, 0, 0),
            List(88))) {
            val result = list match {
                case List(0) => "0" //匹配List(0)
                case List(x, y) => x + "," + y //匹配有两个元素的List
                case List(0, _*) => "0 ..."
                case _ => "something else"
            }

            println(result)
        }
        
        0
        1,0
        0 ...
        something else
        something else

匹配元组

        for (tuple <- Array(
            (0, 1),
            (1, 0),
            (1, 1),
            (1, 0, 2))) {
            val result = tuple match {
                case (0, _) => "0 ..." //是第一个元素是0的元组
                case (y, 0) => "" + y + "0" // 匹配后一个元素是0的对偶元组
                case (a, b) => "" + a + " " + b
                case _ => "something else" //默认
            }
            println(result)
        }

        0 ...
        10
        1 1
        something else

匹配对象

通过伴生对象定义unapply方法来进行对象之间的相互匹配

    def main(args: Array[String]): Unit = {

        // TODO - 模式匹配 - 匹配规则
        // 匹配对象
        // apply : Attribute => Object
        val user = getUser()
        
        // unapply : Object => Attribute

        user match {
            case User("zhangsan",40) => println("用户为张三")
            case _ => println("什么也不是")
        }

    }
    class User {
        var name:String = _
        var age:Int = _
    }
    object User {
        // Object => Attribute
        def unapply(user: User): Option[(String, Int)] = {
            Option( (user.name, user.age) )
        }

        // Attribute => Object
        def apply( name : String, age:Int ) = {
            val user = new User()
            user.name = name
            user.age = age
            user
        }
    }
    def getUser() = {
        User("zhangsan", 30)
    }

模式匹配用法

  • 直接取元组value
val (_, name, _) = (1, "zhangsan", 30)
println(name) ==> zhangsan 
  • 直接取map的key
val map = Map(
    ("a", 1), ("b", 2), ("c", 3)
)
for ( (k, 2) <- map ) {
    println( k ) ==> b
}
  • 用模式匹配去替换 ‘_ ‘ 加索引
        val list = List(
            (("河北", "鞋"), 10),
            (("河北", "衣服"), 20),
            (("河北", "电脑"), 15),
        )

        list.map(
            (t) => {
                t
            }
        )

        // 下面的代码中,使用模式匹配需要注意:
        // 1. 匹配数据时,需要使用case关键字
        // 2. case分支可能存在多个,那么需要将map的小括号换成大括号
        val list1 = list.map {
            case ((prv, item), cnt) => {
                (prv, (item, cnt * 2))
            }
        }

样例类

在编译时,会自动生成大量的方法

  1. 样例类会自动实现可序列化接口
  2. 样例类的构造参数直接能够作为属性使用,但是不能修改,如果想要修改,需要将参数使用var声明
  3. 增加和重写了大量的方法
  4. 样例类自动生成伴生对象,而且其中自动声明了apply,unapply
    def main(args: Array[String]): Unit = {
        val user = getUser()
        user.name = "lisi"
        user match {
            case User("zhangsan",40) => println("用户为张三")
            case _ => println("什么也不是")
        }
    }

    case class User(var name:String, age:Int)
    def getUser() = {
        User("zhangsan", 40)
    }

偏函数

以偏概全

  • 全量函数 :函数进行处理时必须对所有的数据进行处理。

            
            val list = List(1,2,3,4)
            // map只支持全量函数操作
            // 1 => 2
            // 2 => Unit
            // 3 => 6
            // 4 => Unit
            val list1 = list.map(
                num => {
                    if ( num % 2 != 0 ) {
                        num * 2
                    }
                }
            )
            println(list1) ==> List(2, (), 6, ())
    
  • 偏函数 : 函数进行处理时只对满足条件的数据进行处理文章来源地址https://www.toymoban.com/news/detail-807302.html

            // 将该List(1,2,3,4,5,6,"test")中的Int类型的元素加一,并去掉字符串
            val list : List[Any] = List(1,2,3,4,5,6,"test")
            val list1 = list.map {
                case i : Int => {   // 只匹配Int类型
                    i + 1
                }
                case other => other
            }.filter(_.isInstanceOf[Int])
    
            println(list1)
    
            val list : List[Any] = List(1,2,3,4,5,6,"test")
    
            val list1 = list.collect{
                case i : Int => i + 1
            }
    
            println(list1)
    

到了这里,关于Scala-模式匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Scala编程基础:表达式、函数、模式匹配与集合操作

    本文详细介绍了Scala编程的基础知识,包括表达式的使用,方法与函数的区别,模式匹配的各种模式,以及Scala Trait(特质)的定义和使用。

    2024年04月14日
    浏览(49)
  • 交换机欺骗(Switch Spoofing)简介

    交换机欺骗是修改设备的 MAC 地址以伪装成授权交换机端口并获得对目标网络的访问权限的过程。由于 MAC 地址对于特定设备是唯一的,因此大多数网络使用这些 MAC 地址来验证设备并与其通信或建立网络连接。通过欺骗授权设备或更简单地说,网络识别为“受信任设备”的设

    2024年02月05日
    浏览(38)
  • 认识spark,Scala简介

    Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发的通用内存并行计算框架Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京

    2024年03月20日
    浏览(39)
  • Scala简介和安装

    Scala是一种多范式的编程语言(多范式:多种编程方法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法),其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序 官网:https://www.scala-lang.org/

    2024年02月08日
    浏览(35)
  • 大数据之Scala简介

    学习Scala是因为Spark框架就是有Scala编写的,想学习Spark,首先需要对Scala有一定的了解。 Scala的语言特点: Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言(静态语言需要提前编译的如:Java、c、c++等,动态语言如

    2024年02月02日
    浏览(34)
  • 【C语言趣味教程】(10) 分支语句 Ⅱ:switch 语句 | fall-through 效应 | default 子句 | else 特性详解 | else 匹配原则 | 悬空 else 隐患

        🔗 《C语言趣味教程》👈 猛戳订阅!!! 0x00 switch 的语法 📚 介绍: switch 语句是一种多分支语句,常常用于 \\\"多分支\\\" 的情况。 用于不同条件执行不同动作,每一个 case 分支都是唯一的,从上往下逐一测试直到匹配为止。 一个标准的 switch 语句由三部分组成: case

    2024年02月03日
    浏览(52)
  • 用策略模式加工厂模式优化多重if-else或者switch代码

    情景:通过不同的出行方式和数量拿到不同的减碳量 代码从controller开始贴 是为了更贴近真实场景 原始代码 controller: 枚举类: TravelEnum: service: 改进: controller: swevice: 其中 GreenTravelModeService 是一个接口: GreenTravelModeService 有三个实现类,分别代表 三种不同出行方式获得减碳的

    2024年02月03日
    浏览(43)
  • 04 DC-DC变换器(DCDC Converter / Switched-mode Power Supply)简介

    针对B站视频,截取ppt做的完整笔记,视频地址附在下方 0、DC-DC变换器概述 简述 DC-DC变换器是指能将一种直流输入电压(或电流)变换成另一等级直流输出电压(或电流)的装置。 1)移动电子设备供电(DC/DC开关电源 LDO低压差线性电源) 2)高效LED电源 3)功率优化器(光伏

    2023年04月27日
    浏览(38)
  • C++类模板实现工厂模式(优化if else/switch case)

    引自:https://blog.csdn.net/weixin_43795921/article/details/127224633 template typename IdentifierType, class AbstractProduct, class ProductCreator = AbstractProduct *(*)(), class MapContainer = std::mapIdentifierType, ProductCreator class Factory { public: bool Register(const IdentifierType id, ProductCreator creator) { return producers_.insert(std::make

    2024年02月13日
    浏览(53)
  • STM8低门槛快速入门,类似Arduino封装库模式开发介绍

    📌STM8外设封装库原项目开源地址: https://github.com/gicking/STM8_templates 📍个人整理过的项目地址: https://github.com/perseverance51/STM8-Templates 🏳‍🌈说明:类似Arduino封装库,并不是在Arduino平台来开发STM8。开发模式是基于SDCC和STVD环境的。编译速度是Arduino开发环境没法比的。 📓STM

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包