变量 match {
case 值 => 代码
case 值 => 代码
case 值 => 代码
....
case _ => 代码
}
2 整型值模式匹配实例
//整行值模式匹配
def test1(grade:String): Unit ={
grade match {
case "A" => println("Excellent...")
case "B" => println("Good...")
case "C" => println("Just so so...")
case _ => println("You need to work harder...")
}
}
test1("A")
test1("D")
结果:
Excellent...
You need to work harder...
3 带有if条件的模式匹配
def test2(name:String,grade:String): Unit ={
grade match {
case "A" => println("Excellent...")
case "B" => println("Good....")
case "C" => println("Just so so....")
case _ if name == "haha" => println(name + ", you are a good boy, but ...")
case _ => println("You need to work harder....")
}
}
test2("zhangsan","B")
test2("haha","F")
test2("lisi","x")
结果:
Good....
haha, you are a good boy, but ...
You need to work harder....
4 数组的模式匹配
def test3(arr: Array[String]) {
arr match {
//只有一个hadoop元素
case Array("Hadoop") => println("Hi, Hadoop")
// 2个任意的元素
case Array(x, y) => println("Hi:" + x + " and " + y )
// zhangsan开头的任意多个元素
case Array("zhangsan", _*) => println("Hi, zhangsan and others")
case _ => println("hey, who are you?")
}
}
test3(Array("hadoop"))
test3(Array("haha","hehe"))
test3(Array("zhangsan","lisi","wangwu"))
结果:
hey, who are you?
Hi:haha and hehe
Hi, zhangsan and others
5 集合的模式匹配
def test4(list: List[String]): Unit = {
list match { // list = head + tail
//只含有zhangsan一个元素
case "zhangsan"::Nil => println("Hi: zhangsan")
//任意两个元素
case x::y::Nil => println("Hi:" + x + " , " + y)
//第一个元素为haha的任意多个元素
case "haha"::tail => println("Hi:haha and other friends...")
case _ => println("Hi: everybody...")
}
}
test4(List("zhangsan"))
test4(List("lengtouqing","tietouwa"))
test4(List("haha","hehe","heihei"))
结果:
Hi: zhangsan
Hi:lengtouqing , tietouwa
Hi:haha and other friends...
6 任意类型的模式匹配
def test5(obj:Any): Unit = {
obj match {
case x:Int => println("int")
case s:String => println("string")
case m:Map[_,_] => m.foreach(println)
case _ => println("other type")
}
}
test5(1)
test5("zhangsan")
test5(Map("01" -> "zhangsan"))
结果:
int
string
(01,zhangsan)
7 异常处理
//异常处理
try {
val i = 1/0
} catch {
case e:ArithmeticException => println("除数不能为0...")
case e:Exception => println(e.getMessage)
} finally {
// io file
println("finally.....") // 是肯定执行的,通常用于做资源的释放使用
}
结果:
除数不能为0...
finally.....
class Person
case class Teacher(name: String, subject: String) extends Person
case class Student(name: String, classroom: String) extends Person
def test6(p: Person) {
p match {
case Teacher(name, subject) => println("Teacher, name is " + name + ", subject is " + subject)
case Student(name, classroom) => println("Student, name is " + name + ", classroom is " + classroom)
case _ => println("Illegal access, please go out of the school!")
}
}
test6(Teacher("zhangsan","English"))
test6(Student("xiaoming","111"))
结果:
Teacher, name is zhangsan, subject is English
Student, name is xiaoming, classroom is 111
val grades = Map("zhangsan" -> "A", "lisi" -> "B", "wangwu" -> "C")
def getGrade(name: String) {
val grade = grades.get(name)
grade match {
case Some(grade) => println("your grade is " + grade)
case None => println("Sorry, your grade information is not in the system")
}
}
getGrade("zhangsan")
getGrade("zhaoliu")
结果:
your grade is A
Sorry, your grade information is not in the system
case class SubmitTask(id:String, name:String)
case class HeartBeat(time:Long)
case object CheckTimeOutTask
// 结合Spark的实际代码理解
val inputs = Array(CheckTimeOutTask, HeartBeat(10000), SubmitTask("001","task001"))
//使用Random类产生随机数
inputs(Random.nextInt(inputs.length)) match {
case SubmitTask(id, name) => {
println("SubmitTask: " + id + " , " + name)
}
case HeartBeat(time) => {
println("HeartBeat:" + time)
}
case CheckTimeOutTask => {
println("CheckTimeOutTask")
}
}