scala中的模式匹配

一、常量、类型匹配

object MatcherDemo {

    def typeMatcher(x: Any) = x match {
        // constant patterns
        case 0 => "0: Int"
        case true => "true: Boolean"
        case "hello" => "hello: String"
        case Nil => "an empty List"
        
        // typed patterns
        case s: String => s"String: $s"
        case i: Int => s"Int: $i"
        case f: Float => s"Float: $f"
        case ai: Array[Int] => s"Array[Int]: $ai"
        case as: Array[String] => s"Array[String]: $as"
        
        case c: Cat => s"Cat { name: ${c.name}, age: ${c.age} }"
        case p: Person if p.age < 3 => s"The person is a baby. Person { name: ${p.name}, age: ${p.age} }"
        
        case l: List[_] => s"List[_]: $l"
        case m: Map[_,_] => s"Map[_,_]: $m"
        
        // default
        case _ => "Unknow"
    
    }                                         //> typeMatcher: (x: Any)String
    
    typeMatcher(0)                            //> res0: String = 0: Int
    typeMatcher(true)                         //> res1: String = true: Boolean
    typeMatcher("hello")                      //> res2: String = hello: String
    typeMatcher(List())                       //> res3: String = an empty List
    
    typeMatcher("scala")                      //> res4: String = String: scala
    typeMatcher(11)                           //> res5: String = Int: 11
    typeMatcher(3.14f)                        //> res6: String = Float: 3.14
    typeMatcher(Array(2,8))                   //> res7: String = Array[Int]: [I@45c8e616
    typeMatcher(Array("c++","scala"))         //> res8: String = Array[String]: [Ljava.lang.String;@4cdbe50f
    
    typeMatcher(Cat("Tom",1))                 //> res9: String = Cat { name: Tom, age: 1 }
    typeMatcher(Person("Misa",2))             //> res10: String = The person is a baby. Person { name: Misa, age: 2 }
    
    typeMatcher(List('s,"jk", 2.2))           //> res11: String = List[_]: List('s, jk, 2.2)
    typeMatcher(Map(1 -> 'q, 3.3 -> "ii", 's -> true))
                                                  //> res12: String = Map[_,_]: Map(1 -> 'q, 3.3 -> ii, 's -> true)
    
    typeMatcher(Person("Misa",12))            //> res13: String = Unknow
}

case class Person (name: String, age: Int)
case class Cat (name: String, age: Int)

二、 数组列表和元组匹配

1. 数组

    def arrayMatcher(a: Array[_]) = a match {
        case Array() => "an empty Array"
        case Array(_) => "an one-element Array"
        case Array(0,_) => "a two-element Array with 0 as the first element"
        case Array(true,_*) => "an Array begining with true, having any number of elements"
        case Array(x,y,_*) => x + " -- " + y
        case _ => "Unkonw"
    }                                         //> arrayMatcher: (a: Array[_])String
    
    arrayMatcher(Array())                     //> res14: String = an empty Array
    arrayMatcher(Array(3))                    //> res15: String = an one-element Array
    arrayMatcher(Array(0,4))                  //> res16: String = a two-element Array with 0 as the first element
    arrayMatcher(Array(true,2,5,6))           //> res17: String = an Array begining with true, having any number of elements
                                                  //| 
    arrayMatcher(Array("true",3,1.1))         //> res18: String = true -- 3

2. 元组

    def tupleMatcher(t: Any) = t match {
        case () => "an empty Tuple"
        case x: (_,_) => x._1 + " --- " + x._2
        case (a, b, c) => s"$a and $b and $c"
        case _ => "Unknow"
    }                                         //> tupleMatcher: (t: Any)String
    
    tupleMatcher(())                          //> res19: String = an empty Tuple
    tupleMatcher((true, 'h))                  //> res20: String = true --- 'h
    tupleMatcher(('f, 99, 2.2))               //> res21: String = 'f and 99 and 2.2
    tupleMatcher((true, 's, 11, "scala"))     //> res22: String = Unknow

3. 列表

    def listMatcher(l: Any) = l match {
        case List() =>  "an empty List"
        case x :: y :: Nil => x + " --- " + y
        case 9 :: tail => tail
        // 下面匹配的两种写法
        case x :: y => x + " +++ " + y
        case :: (x, y) => x + " === " + y
        
        case _ => "Unkonw"
    }                                         //> listMatcher: (l: Any)java.io.Serializable
    
    listMatcher(List())                       //> res23: java.io.Serializable = an empty List
    listMatcher(List('s,2))                   //> res24: java.io.Serializable = 's --- 2
    listMatcher(List(true, 'h, 99))           //> res25: java.io.Serializable = true +++ List('h, 99)
    listMatcher(List(9, "scala", 'p))         //> res26: java.io.Serializable = List(scala, 'p)
    listMatcher('k :: List())                 //> res27: java.io.Serializable = 'k +++ List()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 在scala中,模式匹配的熟练使用可以给让程序看起来更加的简洁易懂,该特性有很多使用方法,下边介绍一些不太常用的。...
    蠟筆小噺没有烦恼阅读 207评论 0 0
  • 简单匹配 模式匹配常用于match语句: 变量使用 模式匹配case中可以使用变量来获取参数值 类型匹配 守卫匹配...
    0过把火0阅读 296评论 0 0
  • 早晨八点的时候医生下了病危通知书,这个时候床上的人已经是出气多进气少了,果然不出医生所料,估摸着是十点过一刻,人已...
    境牌薄荷阅读 277评论 0 0
  • 今天我们九龙山的团队聚集在一起,大家相互介绍。 在这个过程中,我认识了很多不同的人,他(她)们基本都来自不同的行...
    迷轩佳阅读 207评论 0 1
  • 今天从塘沽回老家了,又从老家去到了姥姥家,这个过程说起来挺容易,我和妹妹这一路上很难熬,想着怎么总也不到啊...
    玉珺阅读 95评论 0 0