1. 程式人生 > >[Scala]學習筆記四——模式匹配 match

[Scala]學習筆記四——模式匹配 match

一、最基本的模式匹配

例子:

//格式為:
//變數 match{
//			case value1=>程式碼
//			case value2=>程式碼
//			……
//			case _=>程式碼
//}

  def judgeGrade(grade:String): Unit ={
    grade match{
      case "A"=>println("Excellent")
      case "B"=>println("Good")
      case "C"=>println("Just so so")
      case _=>println("You need work hard")
    }
  }
  judgeGrade("A")
  judgeGrade("D")

二、加條件進行模式匹配,可以雙重過濾

//在最後萬用字元的case中新增if語句,來雙重過濾

  def judgeGrade(name:String,grade:String): Unit ={
    grade match{
      case "A"=>println("Excellent")
      case "B"=>println("Good")
      case "C"=>println("Just so so")
      case _ if(name=="Nina")=>println("You are absent the exam")
      case _=>println("You need work hard")
    }
  }
  judgeGrade("Lily","A")
  judgeGrade("Nina","D")
  judgeGrade("Sam","D")

三、Array匹配模式

def greeting(array:Array[String]): Unit = {
    //對陣列中的內容進行匹配
    array match  {
      case Array("Zhangsan") => println("Hi, " + "Zhangsan")    //陣列中僅有這個元素
      case Array(x, y) => println("Hi, " + x + " and " + y)     //陣列中有兩個元素
      case Array("Zhangsan", _*) => println("Hi, " + "Zhangsan" + " and other friends")       //陣列中有多個元素,但開頭的元素為zhangsan
      case _ => println("Hi, everybody")    //陣列中的內容為其他情況
    }
  }
  greeting(Array("Zhangsan"))
  greeting(Array("Lisi","Nina"))
  greeting(Array("Zhangsan","Lisi","Wangwu"))
  greeting(Array("Lisi","Wangwu","Zhangsan"))

結果:
Hi, Zhangsan
Hi, Lisi and Nina
Hi, Zhangsan and other friends
Hi, everybody

四、List匹配模式

  def greeting(list:List[String]): Unit = {
    //對陣列中的內容進行匹配
    list match  {
      case "Zhangsan"::Nil => println("Hi, " + "Zhangsan")    //陣列中僅有這個元素
      case x::y::Nil => println("Hi, " + x + " and " + y)     //陣列中有兩個元素
      case "Zhangsan"::tail => println("Hi, " + "Zhangsan" + " and other friends")       //陣列中有多個元素,但開頭的元素為zhangsan
      case _ => println("Hi, everybody")    //陣列中的內容為其他情況
    }
  }
  greeting(List("Zhangsan"))
  greeting(List("Lisi","Nina"))
  greeting(List("Zhangsan","Lisi","Wangwu"))
  greeting(List("Lisi","Wangwu","Zhangsan")

結果:
Hi, Zhangsan
Hi, Lisi and Nina
Hi, Zhangsan and other friends
Hi, everybody

五、型別匹配

//型別匹配
  def typeMatch(word:Any){
    word match {
      case n:Int=>println("Int")
      case s:String=>println("String")
      case m:Map[_,_]=>m.foreach(println)
      case _=>println("Other type")
    }
  }

  typeMatch(1)
  typeMatch("1")
  typeMatch(1f)
  typeMatch(Map("name"->"Nina"))

結果:
Int
String
Other type
(name,Nina)

六、異常處理

try{
    val i=10/0
    println(i)
  }catch{
    case e:ArithmeticException=>println("除數不能為0")
    case e:Exception=>println("出錯了")
  }finally {
    //一定會執行的語句
    //若需要讀取檔案,這裡則需要關閉一些檔案流
  }

結果:
除數不能為0

七、case class模式匹配

def matchOffer(person: Person): Unit ={
    person match{
      case CTO(name,floor)=>println("CTO "+name +" is on "+ floor)
      case Employee(name,floor)=>println("Employee "+name +" is on "+ floor)
      case _=>println("Other")
    }
  }

  matchOffer(CTO("Nina","22"))
  matchOffer(Employee("Nina","2"))
  matchOffer(Other("Nina"))

//定義了幾個類
class Person
case class CTO(name:String,floor:String) extends Person
case class Employee(name:String,floor:String) extends Person
case class Other(name:String) extends Person

結果:
CTO Nina is on 22
Employee Nina is on 2
Other

八、Some None模式匹配

val map=Map("Nina"->"A","Lily"->"B")
  //Some和None的模式匹配
  def gradeMatch(name:String): Unit = {
    val grade = map.get(name)
    grade match {
      case Some(grade) => println(name + " your grade is " + grade)
      case None => println("Sorry...")
    }
  }

    gradeMatch("Nina")
    gradeMatch("Lily")
    gradeMatch("Zhangsan")

結果:
Nina your grade is A
Lily your grade is B
Sorry...