C#程序员的Scala之路第十章(模式匹配)

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编程

时间: 2025-01-07 00:04:57

C#程序员的Scala之路第十章(模式匹配)的相关文章

C#程序员的Scala之路第九章(Scala的层级)

1.Scala的类层级 Scala里类的顶端是Any所有的类都继承Any类,Any包括以下几个通用方法: final def ==(that: Any): Boolean final def !=(that: Any): Boolean def equals(that: Any): Boolean def hashCode: Int def toString: String 2个操作符的重载,一个equals方法一个hashCode方法与一个toString方法. 根类Any有两个子类:AnyV

程序员的Scala

C#程序员的Scala之路第九章(Scala的层级) 摘要: 1.Scala的类层级Scala里类的顶端是Any所有的类都继承Any类,Any包括以下几个通用方法:final def ==(that: Any): Boolean final def !=(that: Any): Boolean def equals(that: Any): Boolean de...阅读全文 posted @ 2015-03-30 10:15 qg 阅读(2) | 评论 (0) 编辑 C#程序员的Scala之路第

zz 游戏程序员的学习之路(中文版)

游戏程序员的学习之路(中文版) Milo Yip · 1 天前 感谢 @楚天阔(tkchu)编写脚本及整理中文译本数据,自动从英文版生成中文版,SVG / PDF 版本中的书籍图片现在链接至豆瓣页面. Github miloyip/game-programmer 检视/下载中文版 SVG / PDF 「真诚赞赏,手留余香」 赞赏 15 人赞赏 程序员游戏开发书籍推荐 分享 举报 977 文章被以下专栏收录 Milo的编程 进入专栏 97 条评论 写下你的评论 trycatch 这是劝退吧...

菜鸟程序员的成长之路(三)——2014,逝去的半年,奋斗的半年

从3月份到现在,仅仅半年的时间让我扮演了两个完全不同的角色,从在校生一下变成了毕业生,作为毕业生不能再像在校生一样自由自在,无所顾忌,想怎样就怎样,肆无忌惮的生活,浪费时间.如果你想从容的面临未来的生活,就需要彻头彻尾的改变.多一份稳重,多一份责任,多一份担当. 鉴于LZ不太擅长写非技术博文,那就以碎碎念的形式,来回顾一下我的奋斗历程: 技术 3月份开始备战软考,软考准备了两个多月的时间,从看视频做笔记,再到大家一起讲课,复习,做试题巩固,整个过程至今历历在目.软考虽然不难,但是对于基础差的同学

菜鸟程序员的成长之路(四)——欢送2014,欢迎2015

最近半个月一直想写年终总结,却迟迟没有提笔,不是不知道写什么而是需要写的东西太多,不知从哪下笔.继菜鸟程序员的成长之路(三)--2014,逝去的半年,奋斗的半年,请大家跟我一起再重新将2014"活"一遍. 2014年对于我来说承载了满满的回忆,也是我人生中比较重要的一年,因为在这一年里发生很多重要的事:1.我毕业了:2.我考过了软件设计师了:3.我考上了在职研究生... 学习篇 对于学习,其实有很多想写的内容,由于上篇博文:2014,逝去的半年,奋斗的半年,我已经写了2014上半年的总

程序员修神之路--做好分库分表其实很难之一(继续送书)

菜哥,领导让我开发新系统了 这么说领导对你还是挺信任的呀~ 必须的,为了设计好这个新系统,数据库设计我花了好多心思呢 做一个系统我觉得不应该从数据库入手,应该从设计业务模型开始,先不说这个,说说你的数据库设计的优势 为了高性能我首先设计了分库 分表策略,为以后打下基础 那你的数据量将来会很大吗?分库分表其实涉及到很多难题,你了解过吗? 我觉得分库分表很容易呀 是吗? 是否需要分 说到数据库分库分表,不能一味的追求,我们要明白为什么要进行分库分表才是最终目的.现在网上一些人鼓吹分库分表如何应对了多

2017PHP程序员的进阶之路

又是一年毕业季,可能会有好多毕业生即将进入开发这个圈子,踏上码农这个不归路.根据这些年在开发圈子总结的LNMP程序猿发展轨迹,结合个人经验体会,总结出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序员做对照设定学习成长目标. 该文是按照目前主流技术做了一个最基本的梳理而且假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰. 第1阶段:初级PHP程序员 重点:把LNMP搞熟练(核心是安装配置基本操作

PHP程序员的进阶之路

第1阶段:初级PHP程序员 重点:把LNMP搞熟练(核心是安装配置基本操作)目标:能够完成基本的LNMP环境安装,简单配置维护:能够做基本的简单系统的PHP开发:能够在PHP中型系统中支持某个PHP功能模块的开发.时间:完成本阶段的时间因人而异,有的成长快半年一年就过了,成长慢的两三年也有. 1.Linux: 基本命令.操作.启动.基本服务配置(包括rpm安装文件,各种服务配置等):会写简单的shell脚本和awk/sed 脚本命令等. 2.Nginx: 做到能够安装配置nginx+php,知道

高效程序员的狂暴之路

不觉间已经工作六年,回想第一天实习的场景历历在目.恍若昨日.六年已足以令许多人转管理.转产品.转测试.转行,也一定有人还在坚守着编码,只因热爱.遇到过形形色色的经理.架构师.运维.性能工程师等等,还是觉得写代码的才是最厉害的!在这里分享一些这些年来修习到的个人心得.也许并不适用于其他人,但对于我却都是最珍贵的"宝藏".也谨以此文纪念在代码堆里度过的青春~ 看到这些点点滴滴的收获,就会感到所有逝去的光阴和挥洒的汗水都是值得的. 1.启动:得心应手的工具 1.1 全能IDE 关于IDE,目