1.模式匹配和样例类
1)模式匹配
Scala是没有Java中的switch case语法的,相对应的,Scala提供了更加强大的match case语法,即模式匹配,来替代switch case,match case也被称为模式匹配
match case的语法如下:
变量 match { case 值 => 代码 }
如果值为下划线“_”,则代表了不满足以上所有情况下的默认情况如何处理。
此外,match case中,只要一个case分支满足并处理了,就不会继续判断下一个case分支了。(与Java不同,java的switch case需要用break阻止)
(1)样例类匹配
样例类是一种特殊的类,可用于模式匹配,case class是多例的,后面要跟构造参数,case object是单例的。
带守卫的模式,增加布尔表达式或者条件表达式使得匹配更具体
//定义样例类
abstract class Notification
case class Email(sender:String,title:String)extends Notification
case class SMS(caller:String,message:String)extends Notification
case class VoiceRecording(contactName:String,link:String)extends Notification
//基于样例类的模式匹配
object CaseClassDemo2 {
def showNotification(notification: Notification)={
notification match {
case Email(sender,title) => s"$sender+ '---' + $title"
case SMS(caller,msg) => s"you get an $msg from $caller"
case VoiceRecording(name,link) => s"you get info from $name"
case _ =>println("other message")
}
}
def main(args: Array[String]): Unit = {
val email = Email("kate","email info")
println(showNotification(email))
}
}
(2)类型匹配
Scala的模式匹配一个强大之处就在于,可以直接匹配类型,而不是值
注意: 当你在匹配类型的时候,必须给出一个变量名,否则你将会拿对象本身来进行匹配
val arr = Array("hs", 1, 2.0, 'a')
val obj = arr(Random.nextInt(4))
println(obj)
obj match {
case x: Int => println(x)
case s: String => println(s.toUpperCase)
case _: Double => println(Int.MaxValue)
case _ => 0
}
(3)匹配字符串
/**
* 模式匹配-字符串
*/
object MatchString {
def main(args: Array[String]): Unit = {
val arr = Array("zhoudongyu", "yangzi", "guanxiaotong", "zhengshuang")
val name = arr(Random.nextInt(arr.length))
println(name)
name match {
case "zhoudongyu" => println("周冬雨")
case "yangzi" => println("杨紫")
case "guanxiaotong" => println("关晓彤")
case "zhengshuang" => println("郑爽")
case _ => println("Nothing ...")
}
}
}
(4)数组匹配
object ArrayMatch {
//数组匹配
def main(args: Array[String]): Unit = {
val arr = Array(1,2)
val res = arr match {
//匹配数组中只有某个元素:元素0
case Array(0) =>"0"
//匹配任何一个含有两个元素的数组,并将元素绑定到x和y
case Array(x,y) =>s"$x,$y"
//匹配第一个元素是0 的数组
case Array(0,_*) =>"0......."
//匹配不上时
case _ =>"no match"
}
println(res)
}
}