2019独角兽企业重金招聘Python工程师标准>>>

摘要: 一. scala 模式匹配(pattern matching) pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 scala 的语言的一大利器。

一. scala 模式匹配(pattern matching)

pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 scala 的语言的一大利器。

scala 的 pattern matching 是类似这样的,

e match {case Pattern1 => do Somethingcase Pattern2 if-clause => do others...
}

其中,变量 e 后面接一个 match 以及一个代码块,其中每个 case 对应一种可能回匹配的类型,如果匹配成功则执行 => 后面的代码。

我们可以用一个具体一些的例子来看看模式匹配是怎么工作的:

case class Player(name: String, score: Int)
def printMessage(player: Player) = player match {case Player(_, score) if score > 100000 =>println("Get a job, dude!")case Player(name, _) =>println("Hey, $name, nice to see you again!")
}

看起来有点类似于其他语言的 switch,但其实还是有很大的不同的。

以java 的 switch 为例,java 的 switch 仅仅会做一些基本类型的匹配,然后执行一些动作,并且是没有返回值的。

而 scala 的 pattern matching match 则要强大得多,除了可以匹配数值,同时它还能匹配类型。

def parseArgument(arg: String) = arg match {//匹配值case "-h" | "--help" => displayHelpcase "-v" | "--version" => displayVerioncase whatever => unknownArgument(whatever)
}
def f(x: Any): String = x match {//匹配类型case i:Int => "integer: " + icase _:Double => "a double"case s:String => "I want to say " + s
}

同时 pattern matching 是有返回值的,比如上面的 match ,它返回的就是一个 Unit。我们也可以修改上面的代码让它返回一个字符串:

case class Player(name: String, score: Int)
def message(player: Player) = player match {case Player(_, score) if score > 100000 =>"Get a job, dude!"case Player(name, _) =>"Hey, $name, nice to see you again!"
}

值得一提的是, pattern matching 返回值是由第一个匹配的模式中的代码块决定的。

二. 为什么要用 pattern matching

看到这里你会发现一个问题, pattern matching 不是和if else 差不多吗?那为什么还要使用 pattern matching 呢?

首先我们需要明白,模式匹配其实本质上是提供一个方便的解构 (Destructuring) 数据结构的方式,以 scala 为例, pattern matching 其实用到了 scala 中提取器的功能, 提取器其实就是类中的 unapply () 方法。

trait User {def name: String
}
class FreeUser(val name: String) extends User
object FreeUser {//提取器def unapply(user: FreeUser): Option[String] = Some(user.name)
}
  val user: User = new FreeUser("Daniel")user match {case FreeUser(name) => println("it match here" + name)case _ => println("not me")}

明白了模式匹配的本质你就会直到,其实 if else 只是 pattern matching 中的一个典型的用法,但并非它的全部。

同时, pattern matching 允许你解耦两个并不真正属于彼此的东西,也使得你的代码更易于测试。比如上面的 match 部分的代码我们可以写成下面这样:

  val user: User = new FreeUser("Daniel")//将返回结果存在一个常量中val message = user match {case FreeUser(name) => "it match here" + namecase _ => "not me"}//可以随意使用该常量,实现解耦println(message)

这样会赋予代码更多的灵活性,同时也更加方便做进一步操作。

而以可读性的角度来说,使用一大堆的 if else 代码无疑是比较难看的,而如果使用 pattern matching 的话,代码会简洁清晰很多,而简洁的代码则会更容易阅读。

参考文章:

https://doc.yonyoucloud.com/doc/guides-to-scala-book/chp3-pattern-everywhere.html

https://www.zhihu.com/question/30354775

原文链接

转载于:https://my.oschina.net/u/1464083/blog/2877114

聊聊 scala 的模式匹配 1相关推荐

  1. 聊聊 scala 的模式匹配

    一. scala 模式匹配(pattern matching) pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 sc ...

  2. Scala学习—模式匹配

    scala的模式匹配除了可以对值进行匹配之外,还可以对类型进行匹配.对Array和LIst的元素进行匹配.对case class进行匹配.甚至对有值或没值(Option)进行匹配. scala是没有j ...

  3. Scala之模式匹配

    模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理. 但是Scala的模式匹配的 ...

  4. scala的模式匹配

    object MatchObject {def main(args: Array[String]): Unit = {//模式匹配的使用val number: Double = 25.0number ...

  5. Scala模式匹配的亮点——Martin Odersky访谈(四)

    Martin Odersky向Bill Venners和Frank Sommers谈论Scala模式匹配的机制和目的. \\ Scala是一种新兴的通用用途.类型安全的Java平台语言,结合了面向对象 ...

  6. 【Scala】Scala中的模式匹配、类型参数与隐式转换

    1.模式匹配 (1)概述 模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理.但 ...

  7. 大数据系列修炼-Scala课程07

    由于昨天下班后有点困,就没有来及写博客,今天会把它补上!把这个习惯坚持下去! 关于Scala高阶函数详解 1.Scala高阶函数代码实现:高阶函数就是在我们函数中套用函数 2.高阶函数代码详解:高阶函 ...

  8. 【开发工具】SCALA

    Scala是一门多范式的编程语言,一种类似java的编程语言 [1] ,设计初衷是实现可伸缩的语言 [2] .并集成面向对象编程和函数式编程的各种特性. Scala编程语言抓住了很多开发者的眼球.如果 ...

  9. Scala Case类和对象

    Scala是没有Java中的switch case语法的,相对应地,scala提供了更加强大的match case 语法,即模式piper,类替代switch case,match case也被称为模 ...

最新文章

  1. TOF摄像机可以替代Flash激光雷达吗?
  2. linux 安装包 在此作用域中尚未声明_Linux运行go项目报错:copy_file_range: bad file descriptor...
  3. cuda win10安装
  4. Jmeter自定义函数和引入外部文件的几种方法
  5. dataset中获取图像的名字_GDAL与OpenCV的图像像素读取格式互相转换
  6. Autoware安装和快速使用
  7. MyCat 入门指南
  8. Android中Context详解
  9. css-动画-transition-过渡动画
  10. Python群机器人发送城市天气情况
  11. Leetcode 437.路径总和III
  12. springBoot 注入@Slf4j,框架中的方法无法调用。。。
  13. 增加ssh无密码信任连接的安全性
  14. signalr判断对方是否和服务器断开_感情初期,如何快速判断对方是否合适,看这三件事...
  15. 黑猫带你学eMMC协议第25篇:eMMC命令队列详解(CMDQ)
  16. Hadoop 中的数据类型
  17. 子弹散射——Unity随手记(2021.2.4)
  18. 编译原理第四章练习题
  19. 无盘服务器汇聚,Microsoft PowerPoint - 网吧无盘系统网卡汇聚与交换机汇聚教程(包会).pdf...
  20. 电脑psp模拟器(ppsspp) v1.0.0 中文版​

热门文章

  1. php使用curl发送 json数据
  2. javaSE-基础篇-经典赋值:两变量值的交换
  3. Server系列18:如何通过组策略赋予domain user受限网络管理权限?
  4. Struts提供我们方便地将客户端上传的文件处理
  5. hadoop 动态添加节点datanode及tasktracker
  6. asp 图片上传源码 【亲测】
  7. C# http监听之Nancy.net
  8. 该不该怼老板,关键在于你会不会
  9. 赛前集训前的总结(警醒)
  10. Selenium Firefox 官方Webdriver -- Geckodriver 下载地址