模式匹配的类型

包括:

  • 常量模式
  • 变量模式
  • 构造器模式
  • 序列模式
  • 元组模式
  • 变量绑定模式等。

常量模式匹配

常量模式匹配,就是在模式匹配中匹配常量

objectConstantPattern{
  def main(args:Array[String]) :Unit = {
    //模式匹配结果作为函数返回值
    defpatternShow(x : Any) = x match {
      case => "五"
      case true => "真"
      case "test" => "字符串"
      case null => "null值"
      case Nil => "空列表"
      case _ => "其他常量"
    }
    println(patternShow())
    println(patternShow(true))
    println(patternShow(List()))
  }
}

变量匹配

变量匹配,匹的是case语句后面接的是scala变量,如case x if(x == 5) => x等,在使用时一般会加守卫条件,当然也可以像case x => x这样使用,它会匹配任何输入的合法变量。

objectVariablePattern{
  def main(args:Array[String]) :Unit = {
  //模式匹配结果作为函数返回值
  defpatternShow(x : Any) = x match {
    case x if (x == ) => x
    case x if (x == "Scala") => x
    case _ =>
  }
  println(patternShow())
  println(patternShow("Scala"))
  }
}

构造器模式

构造器模式指的是,直接在case语句后面接类构造器,匹配的内容放置在构造器参数中。

//将Person类定义为case class
case class Person(name : String,age : Int) object ConstructorPattern{
    def main(args:Array[String]) :Unit = {
      val p = new Person("nyz",)
      def constructorPattern(p : Person) = p match {
        //构造器模式必须将Person类定义为case class,否则需要自己定义伴生对象并实现unapply方法。
        case Person(name,age) => "name =" + name + ",age =" + age
        //case Person(_,age) => "age =" + age
        case _ => "Other"
      }
      println(constructorPattern(p))
    }
}

序列化模式

序列模式用于匹配如数组Array、列表List、Range这样的线性结构集合,其实原理也是通过case class起作用的。

object SequencePattern{
  def main(args:Array[String]) :Unit = {
    val list = List("spark","Hive","SparkSQL")
    val arr = Array("SparkR","Spark Streaming","Spark MLib")
  def sequencePattern(p : Any) = p match {{
    //序列模式匹配,_*表示匹配剩余内容,first、second匹配数组p中的第一、二个元素
    case Array(first,second,_*) => first + "," + second
    //_匹配数组p的第一个元素,但不赋给任何变量
    case List(_,second,_*) => second
    case _ => "Other"
  }
  println(SequencePattern(list))
  println(SequencePattern(arr))
  }
}

元组模式

元组模式用于匹配scala中的元组内容,用于匹配元组类型的变量内容

object TuplePattern{
  def main(args:Array[String]) :Unit = {
    val list = List("spark","Hive","SparkSQL")
  def tuplePattern(t : Any) = t match {{
    case (one,_,_) => one
    //_*不适合用于元组,只适用于序列
    //case (one,_*) => one
    case _ => "Other"
  }
  println(tuplePattern(t))
  }
}

类型模式

它可以匹配输入待匹配变量的类型

object TypePattern{
  def main(args:Array[String]) :Unit = {
  def typePattern(t : Any) = t match {
    case t : String => "String"
    case t : Int => "Intger"
    case t : Double => "Double"
    case _ => "Other Type"
  }
}

变量绑定模式

在进行模式匹配时,有时不仅仅只是返回一个变量,也可以将某个变量绑定到某个模式上。从而将整体匹配结果赋值给该变量。
 

具体使用方法是在模式前面加变量和@符号。

object VariableBindingPattern{
  def main(args:Array[String]) :Unit = {
    var t = List(List(,,),List(,,))
  def variableBindingPattern(t : Any) = t match {{
    //变量绑定,采用变量名(这里是e)
    //与@符号,如果后面的模式匹配成功,则将整体匹配结果作为返回值
    case List(_,e@List(_,_,_)) => e
    case _ => Nil
  }
  println(variableBindingPattern(t))
  }
}

scala 常用模式匹配类型的更多相关文章

  1. Scala 常用语法

    Clojure首先是FP, 但是由于基于JVM, 所以不得已需要做出一些妥协, 包含一些OO的编程方式 Scala首先是OO, Java语法过于冗余, 一种比较平庸的语言, Scala首先做的是简化, ...

  2. Scala之模式匹配(Patterns Matching)

    前言 首先.我们要在一開始强调一件非常重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中.这是Scala模式匹配之所以重要且实用的一个关键因素!我们会在文章的后半部分具 ...

  3. Scala的存在类型

    Scala的存在类型 存在类型也叫existential type,是对类型做抽象的一种方法.可以在你不知道具体类型的情况下,就断言该类型存在. 存在类型用_来表示,你可以把它看成java中的?. 下 ...

  4. SQL常用字段类型

    中文常用字段类型 1.   名称类    nvarchar(10) 2.   数量       int 3.   时间      date 4.   货币      money 5.   编号     ...

  5. 第54讲:Scala中复合类型实战详解

    今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...

  6. 第53讲:Scala中结构类型实战详解

    今天学习了scala的结构类型,让我们看看代码 class Structural {def open() = print("A class interface opened") } ...

  7. Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  8. Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  9. C++中string转化为常用数值类型

    //模板类 用于将string类型转化为 常用数值类型 template <class Type> Type stringToNum(const string& str) { is ...

随机推荐

  1. C语言新手写扫雷攻略2

    接下来是游戏的功能设计,要有扫雷的基本功能,左键点击雷区,右键红旗标记,并且可以统计雷数,可以重新开始,以下是游戏的功能初始 void Game(void) { while (1) { if (FLA ...

  2. STM32嵌入式开发学习笔记(六):串口通信(上)

    本文我们将了解STM32与外部设备通过串口通信的方式. 所谓串口通信,其实是一个类似于计算机网络的概念,它有物理层,比如规定用什么线通信,几伏特算高电平,几伏特算低电平.传输层,通信前要发RTS,CT ...

  3. hdu2089数位DP

    旁听途说这个名字很久了,了解了一下. 改题目的意思是给你若干区间,让你找寻区间内不含62或4的数. 首先暴力必然T...那么实际上就是说,想办法做一种预处理,在每次输入的时候取值运算就可以了. 既然是 ...

  4. WebKit资源

    WebKit 资料搜集 1 what is webkit? WebKit 是一个开源浏览器网页排版引擎,与之相应的引擎有Gecko(Mozilla,Firefox 等使用的排版引擎)和Trident( ...

  5. (转)VS2015基础 指定一个或多个项目执行 - 心少朴的博客

           慈心积善融学习,技术愿为有情学.善心速造多好事,前人栽树后乘凉.我今于此写经验,愿见文者得启发. 这个解决方案下,有两个项目, 看到黑体的project了吗?它就是指定执行的项目. 这两 ...

  6. qemu通过命令行直接引导linux内核启动

    qemu -kernel vmlinuz-3.14.0 -hda img_custom -append root=/dev/sda1

  7. Decision Tree、Random Forest、AdaBoost、GBDT

    原文地址:https://www.jianshu.com/p/d8ceeee66a6f Decision Tree 基本思想在于每次分裂节点时选取一个特征使得划分后得到的数据集尽可能纯. 划分标准 信 ...

  8. 剑指offer——65和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  9. Jackson第一个程序

    再进入学习jackson库的细节之前,让我们来看看应用程序操作功能.在这个例子中,我们创建一个Student类.将创建一个JSON字符串学生的详细信息,并将其反序列化到学生的对象,然后将其序列化到JS ...

  10. DQL 数据查询语言 show

    2.show show databases; 查看所有的库 show tables; 查看当前库的所有的表 show tables from database; 查看指定的库下的所有表 show pr ...