Scala入门之模式匹配

1. 蘑菇云课堂代码

package com.dtspark.scala.basics

class DataFrameWork

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

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

/**
  * 模式匹配主要分为以下几种匹配:
  * 1.值匹配
  * 2.类型匹配
  * 3.集合内容匹配
  * 4.样例类匹配
  * 5.提取匹配
  * 6.正则匹配
  */
object helloPatternMatch {
  def main(args: Array[String]): Unit = {
    //        getSalary("Scala")
    getSalary("sllsjsl", 6)         //name: sllsjsl age: 6$120000/year

    getMatchType(100.0)             //Double

    getMatchCollection(Array("Spark", "Python"))  //Many elements begins with Spark
    getMatchCollection(Array(1, 3))               //two number

    //case class 会自动生成apply方法,从而省去new操作
    getBigDataType(ComputationFramework("Spark", true))  //ComputationFramework :name : Spark : popular :true
    getBigDataType(ComputationFramework("Spark", false)) //ComputationFramework :name : Spark : popular :false

    getBigDataType(StorageFramework("HDFS", true))      //StorageFramework :name : HDFS : popular :true

    getValue("Spark1", Map("Spark" -> "The hottest!", "Hadoop" -> "The olddest"))  //Not Found!!!

    process("""hlf:9527""")     //stock=hlf,price=9527
  }

  /**
    * 值匹配
    */
  def getSalary(name: String, age: Int) {
    name match {
        //=>后面其实是一个函数,前面是条件
      case "Spark" => println("$150000/year")
      case "Hadoop" => println("$100000/year")
      case _ if name == "Scala" => println("$140000/year")//增加守卫条件
      case _ if name == "Hadoop Mapreduce" => println("$90000/year")
      case _name if age >= 5 => println("name: " + _name + " age: " + age + "$120000/year")
      case _ => println("$80000/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("Unkown type")
    }
  }

  /**
    * 集合内容匹配
    */
  def getMatchCollection(msg: Array[_]) {
    msg match {
      case Array("Scala") => println("One element")
      case Array(1,3) => println("two number")
      case Array("Scala", "Java") => println("Two elements")
      case Array("Spark", _*) => println("Many elements begins with Spark")
      case _ => println("Unkown 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 {//提取出Map中的key的value值
      case Some(value) => println(value)
      case None => println("Not Found!!!")
    }
  }

  /**
    * 正则匹配
    */
  def process(input: String) = {
    val MatchStock = """^(.+):(\d+\.?\d*)""".r
    input match {
      case MatchStock(stock, price) => printf("stock=%s,price=%s\n", stock, price)//匹配出来的赋值给两个变量
      case _ => println("invalid input " + input)
    }
  }

}

以上内容来自[DT大数据梦工厂]首席专家Spark专家王家林老师的课程分享。感谢王老师的分享,更多精彩内容请扫描关注[DT大数据梦工厂]微信公众号DT_Spark

2.补充内容

Case Class
当一个类被声名为case class的时候,scala会帮助我们做下面几件事情:
1 构造器中的参数如果不被声明为var的话,它默认的话是val类型的,但一般不推荐将构造器中的参数声明为var
2 自动创建伴生对象,同时在里面给我们实现子apply方法,使得我们在使用的时候可以不直接显示地new对象
3 伴生对象中同样会帮我们实现unapply方法,从而可以将case class应用于模式匹配,关于unapply方法我们在后面的“提取器”那一节会重点讲解
4 实现自己的toString、hashCode、copy、equals方法
除此之此,case class与其它普通的scala类没有区别
5 在进行模式匹配的时候,有些时候需要确保所有的可能情况都被列出,此时常常会将case class的超类定义为sealed(密封的) case class,如果不能全部列出会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值