Scala--模式匹配和样例类

模式匹配应用场景:switch语句,类型查询,析构,样例类

一、更好的switch

  val ch :Char = '+'

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

case _ 匹配其他情况,case 结尾不需要break跳出

二、守卫

  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条件; 匹配是顺序下来的,上面的例子是匹配不到守卫的。

三、模式中的变量

case _ 看做是这个特性的一个特殊情况。

四、类型模式

  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)))

结果:

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

Map中的类型匹配是无效的,结果为

Map(1 -> 2)

匹配发生在运行期,Java虚拟机中的泛型信息是被擦掉的。

五、匹配数组、列表和元组

数组:

  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

六、提取器

模式匹配数组,元组,列表,这些背后是提取器机制。对象中有unapply或unapplySeq方法对值进行提取。

unapply方法用于提取固定数量的对象,unapplySeq提取的是一个序列。

七、变量声明中的模式

val (x,y)=(1,2)
上一篇:Hibernate 一对多自身双向关联关系 用于类别表的实现


下一篇:MySQL 实现 先取记录的最后一条 然后 再group 分组 然后 按照 指定的列 进行排序