《scala函數語言程式設計》之模式匹配和異常處理
阿新 • • 發佈:2018-12-13
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) //
[email protected] 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() } }