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,如果不能全部列出会报错
1236

被折叠的 条评论
为什么被折叠?



