package com.lyzx.day20181006
import java.io.{FileNotFoundException, FileReader, IOException}
class MatchTest {
/**
* match 對應 Java 裏的 switch,但是寫在選擇器表達式之後。即: 選擇器 match {備選項}。
* match 表達式通過以代碼編寫的先後次序嘗試每個模式來完成計算,只要發現有一個匹配的case,
* 剩下的case不會繼續匹配。
* f1 和 f2 方法演示
* @param x
* @return
*/
def f1(x:Any): String = x match{
case 1 => "one"
case 2 => "two"
case 3 => "three"
case _ => "many"
}
def f2(x:Any): String ={
val result =
x match {
case 1 => "one"
case 2 => "two"
case 3 => "three"
case _ => "many"
}
"最終結果爲:"+result
}
/**
* 使用了case關鍵字的類定義就是就是樣例類(case classes),樣例類是種特殊的類,經過優化以用於模式匹配。
*/
def f3(): Unit ={
val tom = new Person("tom",22)
val jack = new Person("jack",55)
val pony = new Person("pony",54)
val robin = new Person("robin",53)
for(item <- List(tom,jack,pony,robin)){
item match {
case Person("tom",age) => println("你好,tom age="+age)
case Person("jack",55) => println("你好Jack")
case Person(name,age) => println("你好,陌生人,name["+name+"],age["+age+"]")
}
}
}
/**
* case class 和普通class 的區別
*
*/
def f4(): Unit ={
//1、實例化的時候case class可以不加new 可以加上,但是普通class必須加new關鍵字
val people1 = new People("lyzx",22)
val people2 = new People("lyzx",22)
val person1 = Person("lyzx",22)
val person2 = Person("lyzx",22)
//2、toString的實現更漂亮
println(people1) //com.lyzx.day20181006.People@66d33a
println(person1) //Person(lyzx,22)
//3、默認實現了equals 和hashCode
println("普通類的equals:"+people1.equals(people2)) //false
println("case類的equals:"+person1.equals(person2)) //true
//4、case類實現了Serializable接口
val people1IsSerializable = people1.isInstanceOf[Serializable]
val person1IsSerializable = person1.isInstanceOf[Serializable]
println("普通類是否實現了Serializable接口: "+people1IsSerializable)
println("case類是否實現了Serializable接口: "+person1IsSerializable)
//5、case class構造函數的參數是public級別的,我們可以直接訪問
println(person1.age)
//6、支持匹配模式 在f3方法中可以看到
}
/**
* 異常捕捉的機制與其他語言中一樣,如果有異常發生,catch字句是按次序捕捉的。
* 因此,在catch字句中,越具體的異常越要靠前,越普遍的異常越靠後。
* 如果拋出的異常不在catch字句中,該異常則無法處理,會被升級到調用者處。
* 捕捉異常的catch子句,語法與其他語言中不太一樣。
* 在Scala裏,借用了模式匹配的思想來做異常的匹配,
* 因此,在catch的代碼裏,是一系列case字句,
* finally 語句用於執行不管是正常處理還是有異常發生時都需要執行的步驟
*/
def f5(): Unit ={
try{
val f = new FileReader("111")
} catch {
case e : FileNotFoundException => {
e.printStackTrace()
println("文件未找到異常")
}
case e : IOException =>{
e.printStackTrace()
println("IO異常")
}
}finally{
println("i am finally's context")
}
}
}
case class Person(name:String,age:Int)
class People(name:String,age:Int)
object MatchTest{
def main(args: Array[String]): Unit = {
val t = new MatchTest
// println(t.f2(2))
// t.f3()
// t.f4()
t.f5()
}
}