Scala--模式匹配和樣例類

模式匹配應用場景:switch語句,類型查詢,析構,樣例類git

 

 

1、更好的switch數組

  val ch :Char = '+'

  val sign =
  ch match{
    case '+' => 1
    case '-' => -1
    case _ => 0
  }

  println(sign)

case _ 匹配其餘狀況,case 結尾不須要break跳出app

 

2、守衛spa

  val ch :Char = '9'

  var digit = 0

  val sign =
  ch match{
    case '+' => 1
    case '-' => -1
    case _ => 0
    case _ if Character.isDigit(ch) => digit = Character.digit(ch,10)
    //case _ => 0
  }

  println(sign,digit)

守衛能夠是任何Boolean條件; 匹配是順序下來的,上面的例子是匹配不到守衛的。code

3、模式中的變量對象

case _ 看作是這個特性的一個特殊狀況。blog

4、類型模式虛擬機

  var str =1

  def f(s : Any) = s match{
    case i : Int => println("int="+i)
    case s : String=> println("str="+s)
    case m : Map[String,Int]=> println("map="+m)  //Map中的類型匹配是無效的
    case _ => println("unknown")
  }

  f(1)
  f("Hello")
  f(Map((1,2)))

結果:it

int=1
str=Hello
map=Map(1 -> 2)

Map中的類型匹配是無效的,結果爲class

Map(1 -> 2)

匹配發生在運行期,Java虛擬機中的泛型信息是被擦掉的。

5、匹配數組、列表和元組

數組:

  def f (str: Any) = str match{
    case Array() => "0"
    case Array(x,y) => x + " " + y
    case Array(0, _*) => "0..."
    case _ => "something else"
  }

  println(f(Array(1,3)))
  println(f(Array(0,1,3)))
1 3
0...

 

列表:

  def fl (str: Any) = str match{
    case 0::Nil => "0"
    case x::y::Nil => x + " " + y
    case 0::tail => "0..."
    case _ => "something else"
  }

  println(fl(List(0)))
  println(fl(List(1,3)))
  println(fl(List(0,1,3)))
0
1 3
0...

 

元組:

  def ft (str: Any) = str match{
    case (0,_) => "0"
    case (x,y)=> x + " " + y
    case (x,0,_) => "0..."
    case _ => "something else"
  }

  println(ft(Tuple2(0,1)))
  println(ft(Tuple3(1,0,2)))
  println(ft(Tuple4(1,0,2,3)))
0
0...
something else

 

6、提取器

模式匹配數組,元組,列表,這些背後是提取器機制。對象中有unapply或unapplySeq方法對值進行提取。

unapply方法用於提取固定數量的對象,unapplySeq提取的是一個序列。

 

7、變量聲明中的模式

val (x,y)=(1,2)
相關文章
相關標籤/搜索