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. php + mysql 存入表情 【如何转义emoji表情,让它可以存入utf8的数据库】

    方法1:base_encode64 这种方法是可以,但是旧数据没有经过encode操作,取数据的时候如果统一进行decode的话,旧数据会丢失的. 1 方法2:urlencode 这个似乎可以,对没有 ...

  2. 移动端使用fastclick时,模拟原生浏览器对象

    移动浏览器原生click事件有300ms的延时,这是浏览器为了区分到底是双击还是单击事件.(实际上有些移动浏览器不支持双击事件.PC版chrome在手机模式下,当禁止用户双击缩放页面时(即有viewp ...

  3. [原创]networkx 画中文节点

    一直想分享一些自己遇到的坑,但确实很多时候走的太快 很多想做的事情会被快节奏的生活冲淡, 在公司做事反而比学校还自在, 因为是悠闲的实习期... 几点小建议写在前头--xdj: 遇到问题,大多数人首先 ...

  4. java32

    1.抽象类必须有子类才有意义 2.子类中会默认有构造器来调用父类的构造器 3.接口:表示一种规范 interface 接口名(命名规则:在名称前加上I后加上able){ } -2接口也生成对应的字节码 ...

  5. The First Day Of Cnblogs

    The fear of the LORD is the beginning of wisdom,and knowledge of the Holy One is understanding. ——Pr ...

  6. 使用 Chrome 浏览器插件 Web Scraper 10分钟轻松实现网页数据的爬取

    web scraper 下载:Web-Scraper_v0.2.0.10 使用 Chrome 浏览器插件 Web Scraper 可以轻松实现网页数据的爬取,不写代码,鼠标操作,点哪爬哪,还不用考虑爬 ...

  7. mysql 统计某个月每天的数据

    select SUM(order_money) as money,substr(t.pay_time,1,10) as time  from pay_log t where  t.pay_time l ...

  8. homework1-201521410029

    姓名:孙浩学号: 201521410029指导教师:高见                实验日期:2018年8月9日 1. 虚拟机安装与调试 安装好xp和kali虚拟机之后,查看这三者(包括主机)的i ...

  9. Deployment descriptor

    部署描述符是JavaEE程序常见的一部分,部署一个Servlet 3 或以上应用程序是一件轻而易举的事.通过Servlet注解,对于不太复杂的应用程序,甚至可以部署没有描述符的Servlet/JSP应 ...

  10. Shiro与Spring整合

    Shiro引入Spring 添加jar包/maven配置 <!-- shiro支持 --> <dependency> <groupId>org.apache.shi ...