目录
-
模式匹配
scala中有一个非常强大的模式匹配机制,可以应用在很多场景:
1.switch语句
2.类型查询
3.使用模式匹配快速获取数据
简单模式匹配
在Java中,有switch关键字,可以简化if条件判断语句。在scala中,可以使用match表达式替代。
格式:
变量 match {
case "常量1" => 表达式1
case "常量2" => 表达式2
case "常量3" => 表达式3
case _ => 表达式4 // 默认匹配
}
例:
//创建输入对象 StdIn.readLine表示从控制台读取一行文本
var datas = StdIn.readLine()
//模式匹配
datas match {
case "hadoop" => println("这是hadoop")
case "spark" => println("这是spark")
case "kafka" => println("这是kafka")
case _ => println("这是大数据")
}
匹配类型
除了像Java中的switch匹配数据之外,match表达式还可以进行类型匹配。如果我们要根据不同的数据类型,来执行不同的逻辑,也可以使用match表达式来实现
格式:
变量 match {
case 类型1的变量名: 类型1 => 表达式1
case 类型2的变量名: 类型2 => 表达式2
case 类型3的变量名: 类型3 => 表达式3
...
case _ => 表达式4
}
例:
//创建变量 String类型 Any为String父类
var a: Any = "hive"
//对变量进行匹配
a match {
case _: String => println("字符串")
case _: Int => println("s数值")
case _: Double => println("浮点型")
case _ => println("什么也不是")
}
守卫
在scala中,可以使用守卫来在case语句中添加if条件判断
例:
//创建输入对象 StdIn.readLine表示从控制台读取一行文本
val a = StdIn.readInt()
//模式匹配
a match {
case _ if a >= 0 && a <= 3 => println("[0-3]")
case _ if a >= 4 && a <= 8 => println("[3-8]")
case _ => println("未匹配")
}
匹配样例类
scala可以使用模式匹配来匹配样例类,从而可以快速获取样例类中的成员数据。
例:
//创建样例类
case class Person(name: String, age: Int)
case class Order(id: String)
def main(args: Array[String]): Unit = {
//建样例类对象,并赋值为Any类型
val zhangsan: Any = Person("张三", 20)
val order1: Any = Order("001")
//模式匹配
order1 match {
case Person(name, age) => println(s"姓名:${name} 年龄:${age}")
case Order(id) => println(s"ID为:${id}")
case _ => println("未匹配")
}
}
-
Option类型
使用Option类型,可以用来有效避免空引用(null)异常。也就是说,将来我们返回某些数据时,可以返回一个Option类型来替代。
例:
//Some(x):表示实际的值
//None:表示没有值
def dvi(a: Double, b: Double) = {
if (b != 0) {
//表示实际的值
Some(a / b)
} else {
//表示没有值 返回None
None
}
}
def main(args: Array[String]): Unit = {
var num = dvi(10,0)
//模式匹配
num match {
case Some(a) => println(a)
case None => println("??")
}
//找到指定值如果不存在返回指定值
//println(num.getOrElse("?????"))
}