模式匹配

简单匹配

  • Scala的模式匹配最常用于match语句中。下面是一个简单的整型值的匹配实例

object TestMatch {
 def main(args: Array[String]): Unit = {
   val colorNum = 3
   val colorStr = colorNum match {
     case 1 => "red"
     case 2 => "green"
     case 3 => "yellow"
     case _ => "Not Allowed"
  }
   print(colorStr)
}
}
// 执行结果
yellow
  • 另外,在模式匹配的case语句中,还可以使用变量。

object TestMatch {
 def main(args: Array[String]): Unit = {
   val colorNum = 55
   val colorStr = colorNum match {
     case 1 => "red"
     case 2 => "green"
     case 3 => "yellow"
     case unexpected => unexpected + " is Not Allowed"
  }
   print(colorStr)
}
}
// 执行结果
55 is Not Allowed

类型模式

  • Scala可以对表达式的类型进行匹配

object TestMatch {
 def main(args: Array[String]): Unit = {
   for (elem <- List(9,12.3,"spark","Hadoop",'hello)){
     val str = elem match {
       case i: Int => i + " is an int value"
       case d: Double => d + " is a double value."
       case "spark" => "spark is found"
       case s: String => s + " is a string value"
       case _ => "This is an unexpected value"
    }
     println(str)
  }
}
}
// 执行结果
9 is an int value
12.3 is a double value.
spark is found
Hadoop is a string value
This is an unexpected value

“守卫(guard)”语句

  • 可以在模式匹配中添加一些必要的处理逻辑

object TestMatch {
 def main(args: Array[String]): Unit = {
   for (elem <- List(1,2,3,4)){
     elem match {
       case _ if (elem % 2 == 0) => println(elem + " is even.")
       case _ => println(elem + " is odd.")
    }
  }
}
}
// 执行结果
1 is odd.
2 is even.
3 is odd.
4 is even.

for表达式中的模式

  • 格式

for ((k , v) <- 映射) 语句块
scala> val university2 = Map("XMU" -> "Xiamen University","THU" -> "Tsinghua University")
scala> for ((k,v) <- university2) printf("Code is : %s and name is : %s\n" , k , v)
Code is : XMU and name is : xiamen university
Code is : THU and name is : Tsinghua University

case类的匹配

Option类型

  • 标准类库中的Option类型用case类来表示那种可能存在、也可能不存 在的值

  • 一般而言,对于每种语言来说,都会有一个关键字来表示一个对象引 用的是“无”,在Java中使用的是null。Scala融合了函数式编程风格, 因此,当预计到变量或者函数返回值可能不会引用任何值的时候,建 议你使用Option类型

  • Option类包含一个子类Some,当存在可以被引用的值的时候,就可以使用Some来包含这个值,例如Some("Hadoop")。而None则被声明 为一个对象,而不是一个类,表示没有值

scala> val books = Map("hadoop" -> 5,"spark" -> 10,"hbase" -> 7)
books: scala.collection.immutable.Map[String,Int] = Map(hadoop -> 5, spark -> 10, hbase -> 7)
// 下面我们从映射中取出健为Hadoop对应的值,这个建存在的,可以取到值,并且取到的会被包含在some中返回
scala> books.get("hadoop")
res4: Option[Int] = Some(5)
scala> books.get("hive")
res5: Option[Int] = None
  • Option类型还提供了getOrElse方法,这个方法在这个Option是Some的实例时 返回对应的值,而在是None的实例时返回传入的参数。例如:

scala> val sales = books.get("hive")
sales: Option[Int] = None
scala> sales.getOrElse("No Such Book")
res7: Any = No Such Book
scala> println(sales.getOrElse("No Such Book"))
No Such Book

scala> val sales = books.get("hbase")
sales: Option[Int] = Some(7)
scala> println(sales.getOrElse("No Such Book"))
7
  • 可以看出,当我们采用getOrElse方法时,如果我们取的"hive"没有对应的值, 我们就可以显示我们指定的“No Such Book”,而不是显示None。

  • 在Scala中,使用Option的情形是非常频繁的。在Scala里,经常会用到 Option[T]类型,其中的T可以是Sting或Int或其他各种数据类型。 Option[T]实际上就是一个容器,我们可以把它看做是一个集合,只不过这个集 合中要么只包含一个元素(被包装在Some中返回),要么就不存在元素(返 回None)。

  • 既然是一个集合,我们当然可以对它使用map、foreach或者filter等方法。比如:

scala> books.get("hive").foreach(println)
  • 可以发现,上述代码执行后,屏幕上什么都没有显示,因为,foreach遍历遇到 None的时候,什么也不做,自然不会执行println操作

Scala_模式匹配的更多相关文章

  1. XSL学习笔记4 XSLT模式匹配的语法

    模板规则通过使用模式来匹配文档树的节点.模式指定一组条件,用于选择要处理的节点.   模式匹配的语法不光可以在<xsl:template>元素的match属性中使用,还可以在<xsl ...

  2. 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

    之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...

  3. Redis模式匹配删除key

    Redis keys命令支持模式匹配,但是del命令不支持模式匹配,有时候需要根据一定的模式来模糊删除key,这时只能结合shell命令来完成了. 具体命令是: redis-cli KEYS &quo ...

  4. php glob()函数实现目录文件遍历与寻找与模式匹配的文件路径

    采用PHP函数glob实现寻找与模式匹配的文件路径,主要讨论glob()函数的作用和用法,利用glob函数读取目录比其它的要快N倍,因为glob函数是内置函数处理起来自然要快. 一,函数原型 arra ...

  5. Scala的模式匹配

    1.概述 2.程序示例(普通的示例) 3.模式匹配(Array) 4.程序示例(Array) 5.模式匹配(List) 6.程序示例 7.遍历 8.模式匹配(case class) 9.程序示例(传统 ...

  6. 求子串-KPM模式匹配-NFA/DFA

    求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subStrin ...

  7. Oracle 12c 的新功能:模式匹配查询

    模式匹配SQL 在一系列的数据行中辨识出某种模式是一种广泛需求的功能,但在以前的SQL中是不可能的.有许多解决方法,但这些都很难写,很难理解,而且执行效率低下.在Oracle数据库中,从12c开始,你 ...

  8. 【模式匹配】KMP算法的来龙去脉

    1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模 ...

  9. JavaScript学习笔记-用于模式匹配的String方法

    用于模式匹配的String方法:   String支持4种使用正则表达式的方法:           seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的子串的位置,找不到则返回-1,如 ...

随机推荐

  1. poj 3279 Fliptile(二进制)

    http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...

  2. mongo数据库的y2038问题

    查阅mongo for c driver 驱动源码, 发现其 _id 是 12byte  ,其中头4字节,调用time(NULL), 这个函数存在y2038问题. 建议是修改为16byte ,前面8b ...

  3. lazarus,synedit输入小键盘特殊符号的补丁

    unit synedittextdoublewidthchars2; // fix up chinese symbel width //by steven {$mode objfpc}{$H+} in ...

  4. the example of dlsym

    void *handle; int i, (*fptr)(int); /* open the needed object */ handle = dlopen("/usr/home/me/l ...

  5. b2c项目访问

    http://xmpw.testbase.smi170.com:8091/member/movie_coupon_new.php

  6. JDK 规范目录

    JDK 规范目录 1.1 Java 异常处理 2.1 JDK 之 NIO 2 WatchService.WatchKey(监控文件变化) https://mp.weixin.qq.com/s/NIn2 ...

  7. 工具类Utils的单元测试方式

    数据质量功能已经开发完毕,但是要实现单元测试覆盖率80%以上,其他的还好,只是这个工具类实在让我摸不着头脑,其实工具类的单元测试是最简单的,只是自己想复杂了而已: 无返回值模拟: 有返回值模拟: 异常 ...

  8. mybatis 复杂传参

    1基本传参数 Public User selectUserWithCon(@param(“userName”)String  name,@param(“userArea”)String area); ...

  9. WebSocket 长连接 及超时问题解决

    <?phpset_time_limit(0); class SocketService { private $address = 'localhost'; private $port = 80; ...

  10. 半透明全屏蒙层+全屏屏蔽+内容居中+css

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...