模式匹配的简介

  scala语言里的模式匹配可以看作是java语言中switch语句的改进。

模式匹配的类型

  包括:常量模式、变量模式、构造器模式、序列模式、元组模式以及变量绑定模式等。

常量模式匹配

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

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

变量绑定模式
  在进行模式匹配时,有时不仅仅只是返回一个变量,也可以将某个变量绑定到某个模式上。
  从而将整体匹配结果赋值给该变量。
具体使用方法是在模式前面加变量和@符号。
object VariableBindingPattern{
  def main(args:Array[String]) :Unit = {
    var t = List(List(1,2,3),List(2,3,4))
  def variableBindingPattern(t : Any) = t match {{
    //变量绑定,采用变量名(这里是e)
    //与@符号,如果后面的模式匹配成功,则将整体匹配结果作为返回值
    case List(_,e@List(_,_,_)) => e
    case _ => Nil
  }
  println(variableBindingPattern(t))
  }
}

package com.dt.spark.scala.basics

class DataFrameWork
case class ComputationFramework(name : String, popular : Boolean) extends DataFrameWork
case class StorageFramework(name : String, popular : Boolean) extends DataFrameWork

object HelloPatternMatch {
  def main(args: Array[String]): Unit = {
    getSalary("Hadoop MapReduce")
    // getSalary("cdcdc",6)

    getMatchType(100)

    getMatchCollection(Array("Spark","Python"))
  
    getBigDataType(ComputationFramework("Spark",true))
    getBigDataType(ComputationFramework("Spark",false))
    getBigDataType(StorageFramework("HDFS",true))

    getValue("Spark",Map("Spark" -> "The hottest!" , "Hadoop " -> "The old !"))
  }

  //对于匹配模式来说,不需什么break,只要匹配到,就不往下了
  def getSalary(name : String) {
  // def getSalary(name : String,age : Int) {
    name match {
      case "Spark" => println("$1500/year")//表示,如果传入是Spark,则说明匹配成功,执行=>后的语句
      case "Hadoop" => println("$1000/year")
      case _ if name == "Scala" => println("$1800/year")//_ if name == "Scala"是守卫条件的方式,
      case _ if name == "Hadoop MapReduce" => println("$800/year")
      // case _name if age >= 5 => println("name : " + _name + " age : " + age + "$100/year")//getSalary("cdcdc",6)
      case _ => println("$90/year")//_是前面没匹配的。即其他

      //如case _ if (i%4 ==0) => println("$1800/year")这是带守卫条件的方式,对变量的值进行判断。

    }
  }

  def getMatchType(msg : Any) {
    msg match {
      case i : Int => println("Integer")
      case s : String => println("String")
      case d : Double => println("Double")
      case array : Array[Int] => println("Array")
      case _ => println("Unkoen type")
    }
  }

  def getMatchCollection(msg : Any) {
    msg match {
      case Array("Scala") => println("One element")
      case Array("Scala","Java")=> println("Two element")
      case Array("Spark", _*) => println("Many elements begins with Spark")
      case _ => println("Unkoen type")
    }
  }

  def getBigDataType(data : DataFrameWork) {
    data match {
      case ComputationFramework(name, popular) => println("ComputationFramework : " + "name : " + name + "popular : " + popular)
      case StorageFramework(name, popular) => println("StorageFramework : " + "name : " + name + "popular : " + popular)
      case _ => println("Some other type")
    }
  }  

  def getValue(key : String , content : Map[String,String]){
    content.get(key) match {
      case Some(value) => println(value)
      case None => println("Not Found!!!")
    }
  }

}

scala里的模式匹配和Case Class的更多相关文章

  1. Scala学习文档-样本类与模式匹配(match,case,Option)

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...

  2. 第74讲:从Spark源码的角度思考Scala中的模式匹配

    今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...

  3. Scala 经典的模式匹配和尾递归

    Scala 经典的模式匹配和尾递归 package io import java.io.{BufferedWriter, File, FileWriter} import java.text.Simp ...

  4. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  5. Scala基础:模式匹配和样例类

    模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...

  6. scala中的模式匹配

    基本语法 变量 match { case 值1 => 代码 case 值2 => 代码 ... case 值N if (...) => 代码 case _ => 代码 } 常量 ...

  7. scala 模式匹配详解 2 scala里是怎么实现的?

    在这篇martin和另外两位模式匹配领域专家的论文里说了模式匹配的几种实现方式,以及scala是选择哪种方式来实现的.http://lampwww.epfl.ch/~emir/written/Matc ...

  8. scala学习手记40 - 使用case类

    前面两节我们已经多次接触过case关键字了.case关键字不仅可以用在match/case中来执行模式匹配,也可以用来修饰类.不过用case修饰的类也主要是用来做模式匹配.在上一节曾经提到过match ...

  9. erlang 里的if 和 case

    case Expression of Pattern1 [when Guard1] -> Expr_seq1; Pattern2 [when Guard2] -> Expr_seq2; … ...

随机推荐

  1. 我的vim配置脚本

    自己的VIM 配置脚本,拥有自主独立知识产权(参考了一点别人的),只使用了一个插件ctags ,主要实现了一下功能: 自动补全括号,双引号,单引号,包括{},(),"" , ''只 ...

  2. 程序逻辑问题---Writeup

    原题地址:http://ctf5.shiyanbar.com/web/5/index.php 打开后是一处登陆界面 右键查看源代码 发现有一处txt文件 很明显就是程序的源代码 可以看到其中一句 $s ...

  3. 2017-2018-1 20162307 Dijkstra算法

    2017-2018-1 20162307 Dijkstra算法 题目要求 Dijkstra算法,求解附图顶点A的单源最短路径 在纸上画出求解过程,上传截图(注意图上要有自己的学号和姓名) 解题步骤

  4. linux中的文件编码及编码修改

    查看文件编码 在Linux中查看文件编码可以通过以下几种方式: 1.在Vim中可以直接查看文件编码 :set fileencoding 即可显示文件编码格式. 如果你只是想查看其它编码格式的文件或者想 ...

  5. 理解 JavaScript 中的 Function.prototype.bind

    函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其 ...

  6. centos7安装kafka_2.11-1.0.0 新手入门

    系统环境 1.操作系统:64位CentOS Linux release 7.2.1511 (Core) 2.jdk版本:1.8.0_121 3.zookeeper版本:zookeeper-3.4.9. ...

  7. Java线程锁&分布式锁的理解及应用

    了解Java线程锁之前,先理解线程和进程的定义.进程是操作系统分配资源(CPU)的基本单位,线程是CPU执行的基本单位,一个进程可拥有多个线程,同进程间的多个线程共享分配给进程的资源.比如启动JVM时 ...

  8. IOS webView学习

    本文简单介绍下在IOS中,webView的基本用法,也顺便强化下自己的基础知识----天明少羽爬楼梯 一.加载外部HTML 显示webView 报错:NSURLSession/NSURLConnect ...

  9. (转)js中的hasOwnProperty和isPrototypeOf方法

    hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象.不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员.isPrototypeOf ...

  10. 该死的Ubuntu 16.04不自动续租DHCP的IP

    BUG,这是一个BUG,参考:https://bugs.launchpad.net/ubuntu/+source/isc-dhcp/+bug/1551351,如果不自动续租IP,导致的问题就是网线灯还 ...