目录目录
前言
在spark中scala的模式匹配是重要的功能,它大量体现在spark的源码之中,它的作用与Java中的switch语句相似
一、模式匹配是什么?
模式匹配就是Java中的switch语句,如果能够匹配的上,就会执行case的语句,如果匹配不上,就会默认匹配case_,相当于Java中的默认值,与switch不同的一点是它可以匹配类型。
二、模式匹配案例
1.简单模式匹配
object scala01 {
def main(args: Array[String]): Unit = {
/*
使用match进行简单模式匹配
*/
for (i <- 1 to 5) {
//随机取0-3
val index = Random.nextInt(5)
val test: String = index match {
case 1 => "apple"
case 2 => "egg"
case 3 => "pp"
case _ => "none" //相当于默认值
}
println("index:" + index + " res:" + test)
}
}
}
结果为:
index:3 res:pp
index:0 res:none
index:1 res:apple
index:0 res:none
index:0 res:none
2.类型模式匹配
def main(args: Array[String]): Unit = {
/*
类型模式匹配
*/
for (value <- List(9, 12.3, "Spark", "Hadoop", 'Hello)) {
val str = value match {
case i: Int => i + "是整型数据"
case d: Double => d + "是浮点型数据"
case "Spark" => "我是Spark"
case s: String => s + "是字符串"
case _ => "This is an unexpected value."
}
println(str)
}
}
结果是:
9 是整型数据
12.3 是浮点型数据
我是Spark
Hadoop 是字符串
This is an unexpected value.
3.样例类模式匹配
样例类是什么?
样例类也被称作case类,它与普通类相似,但是,当一个类被定义成为case类后,Scala会自动帮你实现一些函数,它就相当于经过优化的类
定义方法如下:
case class 样例类名称(属性:类型,属性:类型,属性:类型....)
样例类的模式匹配
def main(args: Array[String]): Unit = {
/*
样例类模式匹配
*/
//定义样例类
case class phone(brand: String, price: Int)
//对样例类赋值
val hw = new phone("华为", 1000)
val sx = new phone("三星",1100)
val pg = new phone("苹果", 1110)
val xlt = new phone("小灵通", 1111)
for (car <- List(hw, sx, pg,xlt)) {
car match {
case phone("华为", 1000) => println("我是华为")
case phone("三星",1100) => println("我是三星")
case phone(brand, price) => println("我是:" + brand + " 我的价格为:" + price)
}
}
}
结果为:
我是华为
我是三星
我是:苹果 我的价格为:1110
我是:小灵通 我的价格为:1111
4.option类
• 标准类库中的 Option 类型用 case 类来表示那种可能存在、也可能不存在的值。• 一般而言,对于每种语言来说,都会有一个关键字来表示一个对象引用的是“无”,在 Java 中使用的是 null 。 Scala 融合了函数式编程风格,因此,当预计到变量或者函数返回值可能不会引用任何值的时候,建议你使用 Option 类型。• Option 类包含一个子类 Some ,当存在可以被引用的值的时候,就可以使用 Some 来包含这个值,例如 Some("Hadoop") 。而 None 则被声明为一个对象,而不是一个类,表示没有值。
option类可能有些抽象,所以使用代码来进行解释
def main(args: Array[String]): Unit = {
//首先创建一个字典类型的数据并且赋值
val value = Map("age" -> 10, "name" -> "pp", "grade" -> 100)
//从value中取出key为age的值,这个键是存在的,所以可以取出,取到的值在some中
val age: Option[Any] = value.get("age")
//value中并没有包含height这个键,所有这个取不到,只能取到none对象
val height: Option[Any] = value.get("height")
//还可以使用getOrElse方法
// 在Option是Some的实例时返回对应的值,而在是None的实例时返回传入的参数
val name: Option[Any] = value.get("name")
val name1: Any = name.getOrElse("皮")
val weight: Option[Any] = value.get("weight")
val wg: Any = weight.getOrElse("60公斤")
for (i <- List(age, height, name1,wg)) {
println(i)
}
}
结果是:
Some(10)
None
pp
60公斤