Scala中的模式匹配的功能可以应用到switch语句、类型检查、“解构”等多种场合。

简单匹配

Scala的模式匹配最常用于match语句中。Scala的match语句类似Java里的switch。
匹配实例:
  def color(num: Int): String = {
val colorNum = num
val colorStr = colorNum match {
case 1 => "red"
case 2 => "green"
case 3 => "yellow"
//case _ => "Not Allowed" //通配其他条件
case unexpected => unexpected + " is Not Allowed" //可以在模式匹配的case语句中使用变量
}
s"$colorStr" //函数的返回值
} //> color: (num: Int)String color(1) //> res0: String = red
color(5) //> res1: String = 5 is Not Allowed

类型模式

Scala可以对表达式的类型进行匹配。
  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)"语句

在模式匹配中添加一些必要的处理逻辑。
  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) <- 映射) 语句块
映射中的“键”被绑定到变量k上,映射中的“值”被绑定到变量v上。
  val test = Map(111 -> "AAA", "22" -> "BB", '3' -> 'c')
//> test : scala.collection.immutable.Map[Any,Any] = Map(111 -> AAA, 22 -> BB, 3
//| -> c)
for ((k, v) <- test) printf("Key is : %s and value is: %s\n", k, v)
//> Key is : 111 and value is: AAA
//| Key is : 22 and value is: BB
//| Key is : 3 and value is: c

case类的匹配

case类是一种特殊的类,ke以被用于模式匹配。
  case class Car(brand: String, price: Int)
val myBMWCar = new Car("BMW", 1200000) //> myBMWCar : TestScala.Car = Car(BMW,1200000)
val myBenzCar = new Car("Benz", 1500000) //> myBenzCar : TestScala.Car = Car(Benz,1500000)
for (car <- List(myBMWCar, myBenzCar)) {
car match {
case Car("BMW", 1200000) => println("Hello, BMW!")
case Car(brand, price) => println("Brand:" + brand + ", Price:" + price + ", do you want it?")
} //> Hello, BMW!
//| Brand:Benz, Price:1500000, do you want it?
}

Option类型

一般而言,每种语言都会有一个关键字来表示一个对象引用的是“无”,在Java中使用的是null。
而在Scala中,如果变量或者函数返回值可能不会引用任何值的时候,建议使用Option类型。
  • Option类的子类Some,当存在可以被引用的值的时候,可以使用Some来包含这个值
  • None则被声明为一个对象,而不是一个类,表示没有值。
  • Option类型的getOrElse方法,可以在Option是Some的实例时返回对应的值,是None的实例时返回传入的参数。
Option[T]类型
  • Option[T]类型中的T可以是Sting或Int或其他各种数据类型。
  • Option[T]实际是一个特殊的集合,要么只包含一个元素(被包装在Some中返回),要么就不存在元素(返回None)。
  • 可以针对Option[T]使用map、foreach或者filter等集合的方法。
  val books = Map("AAA" -> 111, "BBB" -> 222, "CCC" -> 333)
//> books : scala.collection.immutable.Map[String,Int] = Map(AAA -> 111, BBB ->
//| 222, CCC -> 333)
books.get("AAA") //> res0: Option[Int] = Some(111)
books.get("DDD") //> res1: Option[Int] = None val sales = books.get("BBB") //> sales : Option[Int] = Some(222)
books.get("BBB").getOrElse("No Such Book - BBB")//> res2: Any = 222 books.get("DDD").getOrElse("No Such Book - DDD")//> res3: Any = No Such Book - DDD books.get("CCC").foreach(println) //> 333
books.get("DDD").foreach(println)

注意:

  books.get("AAA") //Key存在,取到的value值被包含在Some中返回
  books.get("DDD") //key不存在,取到的值是None对象

Scala - 快速学习07 - 模式匹配的更多相关文章

  1. Scala - 快速学习05 - 数据结构

    1- 数组(Array) 数组一般包括定长数组和变长数组. 可以不指明数组类型,Scala会自动根据提供的初始化数据来推断出数组的类型. 在Scala中,对数组元素的应用,是使用圆括号,而不是方括号. ...

  2. scala快速学习笔记(二):控制结构,类和对象

    IV.控制结构 1.if/else 除基本用法外,if/else语句能用来赋值,进而代替?:运算符.这得益于在Scala中,每个语句块都有值,就是该语句块最后一个语句的值.请看下面的代码. def a ...

  3. Scala - 快速学习09 - 函数式编程:一些操作

    1- 集合类(collection) 系统地区分了可变的和不可变的集合. scala.collection包中所有的集合类 可变集合(Mutable) 顾名思义,意味着可以修改,移除或者添加一个元素. ...

  4. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

  5. Scala - 快速学习06 - 面向对象

    1- 类 1.1- 简介:类.方法及对象 类是用来创建对象的蓝图. Scala文件中包含的多个类之间,都是彼此可见的,不需要声明为public. 创建对象 定义好类以后,就可以使用new关键字来创建对 ...

  6. Scala - 快速学习04 - 求值策略

    表达式求值策略(Evaluation Strategy) Scala中所有的运算都是基于表达式的. Call By Value - 对函数实参求值,且仅求值一次:函数调用之前对所有表达式进行求值 Ca ...

  7. Scala - 快速学习03 - 基础语法

    1- 变量 变量 mutable variable 在程序运行过程中其值可能发生改变的量 关键词var定义变量,定义时直接进行求值 常量 immutable variable 在程序运行过程中其值不会 ...

  8. Scala - 快速学习02 - 搭建开发环境

    1- 下载与安装 下载链接:http://www.scala-lang.org/download/ CMD To run Scala from the command-line, simply dow ...

  9. Scala - 快速学习01 - Scala简介

    Scala简介 Scala(Scalable Language)是一门多范式(multi-paradigm)编程语言,Scala的设计吸收借鉴了许多种编程语言的思想,具备面向对象编程.函数式编程等特性 ...

随机推荐

  1. POJ 3140.Contestants Division 基础树形dp

    Contestants Division Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10704   Accepted:  ...

  2. Mysql数据库每天定时执行备份方法

    此数据库备份方法是简单的数据库备份方法,就是从Mysql的数据文件下,将数据库文件拷贝到指定的文件夹目录下 1.创建txt文件,添加脚本 net stop mysql xcopy D:\MySql\D ...

  3. 微信小程序开发之搞懂flex布局4——Main Axis

    Main Axis——主轴 当flex-direction设置为row或row-reverse时,主轴的方向为水平方向.此时flex item为行内级元素. 当flex-direction设置为col ...

  4. Madlibs

    name1 = input('请输入一个名字:') name2 = input('再输入一个名字:') animal = input('请输入一种动物:') print('一二三四五{}上山打{}不在 ...

  5. js事件的绑定与移除

    事件的绑定分为3类: <div id='clickEvent'>点击事件</div> 在DOM元素中直接绑定 <div onclick="alert('4567 ...

  6. UGUI小技巧之Text随文本内容自动变化大小

    看了网上很多帖子,都是说在 Text 上面加上 Content Size Fitter 组件,并将对应的轴向改成 Preferred size 就可以实现 Text 大小随着文本内容自适应,如下图: ...

  7. CDR锁定方式

    每个通道的PMA包括一个通道PLL可以配置成接收器CDR.还可以把通道1和4的PLL配置成CMU PLL用于发送器. CDR有两种锁定方式 1.Lock-to-Reference Mode(LTR) ...

  8. python jieba库

    https://www.cnblogs.com/snailclimb/p/9086433.html https://blog.csdn.net/codejas/article/details/8035 ...

  9. 使用java开发spark的wordcount程序(多种实现)

    package spark; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; impo ...

  10. 可遇不可求的Question之SQLSERVER触发器不支持多行插入操作篇

    描述: 我们经常遇到 insert table_a select * from table_b 这样的语句, 同时在表table_a中根据每一条新增的SQL语句,通过触发器来触发对应的一系列的后续操作 ...