标签:
1.样本类
在类前面加入关键字case则该类就是样本类,样本类在实例化的时候,不用new关键字如下:
case class A() object Hello extends App { val v = A //使用样本类之后 val b = new A }
样本类的第二个好处是,他使你的类参数引式的获得val,如下:
case class A(name: String) object Hello extends App { val a = A("name") println(a.name) }
2.模式匹配
模式匹配是个很强大的功能,如下代码:
abstract class Base case class A(name:String,age:Int) extends Base case class B(age:Int,name:String) extends Base object Hello extends App { def baseMatch(base: Base): String = base match{ case A(value,21) => value case B(value,"name2") => value.toString case _=> null } val a = A("name",21) val b = B(22,"name2") println(baseMatch(a)) println(baseMatch(b)) }
关键在于case A(value,21) 与case B(value,"name2") 模式匹配能匹配对象里的值,
它与switch 的功能类似,但是比switch更多变化,他能直接匹配对象里的值,或者说直接匹配对象。
3.变量模式与常量模式
看下面代码:
object Hello extends App { def matchAny(expr : Any) = expr match{ case 0=>"zero" case value => "value :" +value } println(matchAny(0)) println(matchAny("123456")) println(matchAny(123456)) }
value采用的就是变量模式,0采用的就是常量模式
变量模式就是以变量自身为通配符,去匹配。
4.序列模式
如下代码:
object Hello extends App { def matchAny(expr: Any) = expr match { case List(0, 1, _, value) => value case _ => Nil } println(matchAny(0)) println(matchAny(List(0, 1, 4, 5))) println(matchAny(List(0, 1, 3, 9))) }
5.元组模式
如下代码:
object Hello extends App { def tupleAny(expr: Any) = expr match { case (a, b, c) => println("matched :" + a + b + c) case _ => Nil } tupleAny(("a", 1, 3.14)) }
6.类型模式
如下代码:
object Hello extends App { def typeMatch(value: Any) = value match { case x: String => x.length case map: Map[_, _] => map.size case _ => Nil } println(typeMatch("String")) println(typeMatch(Map(1 -> "a", 2 -> "b"))) }
7.模式守卫
如下代码,在匹配表达式后在加上if语句:
object Hello extends App { def typeMatch(value: Any) = value match { case List(1,2,3,e @ _,y) if e == y => e case _ => false } println(typeMatch(List(1,2,3,5,5))) }
更多请参考scala编程
标签:
原文地址:http://www.cnblogs.com/qugangf/p/4383154.html