第十五节 Case Class与模式匹配(二)

Scala入门到精通——第十五节 Case Class与模式匹配(二)

分类:

scalaScala入门到精通

本节主要内容1. 模式的类型

1 常量模式

object ConstantPattern{ def main(args: Array[String]): Unit = {def patternShow(x:Any)=x match {=>=>=>_ =>”Other constant”}println(patternShow(5)) }}

2 变量模式

main(args: Array[String]): Unit = {def patternShow(x:Any)=x match {y => y}println(patternShow(“xxx”)) }}

3 构造器模式

main(args: Array[String]): Unit = {val p=new Person(“摇摆少年梦”,27)def constructorPattern(p:Person)=p match {case Person(name,age) => “Person”case _ => “Other”} }}

4 序列(Sequence)模式 序列模式指的是像Array、List这样的序列集合进行模式匹配

object SequencePattern { def main(args: Array[String]): Unit = {val p=List(“spark”,”hive”,”SparkSQL”)def sequencePattern(p:List[String])=p match {(_,second,_*) => secondcase _ => “Other”}println(sequencePattern(p)) }}

5 元组模式

{ def main(args: Array[String]): Unit = {val t=(“spark”,”hive”,”SparkSQL”)def tuplePattern(t:Any)=t match {case (one,_,_) => onecase _ => “Other”}println(tuplePattern(t)) }}

6 类型模式

{ def main(args: Array[String]): Unit = {def tuplePattern(t:Any)=t match {t:Double=>”Double”}println(tuplePattern(5.0)) }}

上述代码如果不用模式匹配的话,要实现相同的功能,可以通过下列代码实现:

def tuplePattern2(t:Any)={(t.isInstanceOf[(t.isInstanceOf[Double]) (t.isInstanceOf[Map[_,_]]) “MAP”}

7 变量绑定模式

object VariableBindingPattern { def main(args: Array[String]): Unit = {var t=List(List(1,2,3),List(2,3,4))def variableBindingPattern(t:Any)= t match {(_,e@List(_,_,_)) => ecase _ => Nil}println(variableBindingPattern(t)) }}//编译执行后的输出结果为 List(2, 3, 4)2. for控制结构中的模式匹配main(args: Array[String]): Unit = {val m=Map(“china”->”beijing”,”dwarf japan”->”tokyo”,”Aerican”->”DC Washington”)//利用for循环对Map进行模式匹配输出,for((nation,capital)<-m)println(nation+”: ” +capital) }}

正则表达式中的模式匹配:

object RegexMatch { : Unit = {val ipRegex=”(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)”.rfor(ipRegex(one,two,three,four) <- ipRegex.findAllIn(“192.168.1.1”)){println(“IP子段1:”+one)println(“IP子段2:”+two)println(“IP子段3:”+three)println(“IP子段4:”+four)} }}3. Option类型模式匹配

在前面的课程内容中,我们曾经提到过Option类型,Option类型有两个子类,分别是Some和None(单例对象),本小节将从模式匹配的角度对Option类进行重新思考。

下面给出的是Option类在scala语言中的类层次结构:

Option类其实是一个sealed class

[+{ self => /** Returns true if the option is $none, false otherwise. */ def isEmpty: Boolean /** Returns true if the option is an instance of $some, false otherwise. */ def isDefined: Boolean = !isEmpty

下面给出的分别是Some及None的源码:

/** Class `Some[A]` represents existing values of type * `A`. * * @author Martin Odersky * @version 1.0, 16/07/2003 */[+[get = x}/** This case object represents non-existent values. * * @author Martin Odersky * @version 1.0, 16/07/2003 */[get = throw new NoSuchElementException(“None.get”)}

下面的代码演示了其如何应用到模式匹配中:

{ val m=Map(“hive”->2,”spark”->3,”Spark MLlib”->4) def mapPattern(t:String)=m.get(t) match {case Some(x) => println(x);xcase None => println(“None”);-1 } println(mapPattern(“Hive”))}

前面我们看到:None是一个case object,它同Some一样都extends Option类,只不过Some是case class,对于case class我们已经很熟悉了,那case object它又是怎么样的呢?假设我们定义了以下类:

{}在旅途中,我遇见了你,你我相识是缘分!

第十五节 Case Class与模式匹配(二)

相关文章:

你感兴趣的文章:

标签云: