`
tongqingqiu
  • 浏览: 24797 次
  • 性别: Icon_minigender_1
  • 来自: 亚特兰大
社区版块
存档分类
最新评论

Scala基础(8)- 模式匹配

阅读更多

Scala强大的模式匹配机制,可以应用在switch语句、类型检查以及“析构”等场合。样本类对模式匹配进行了优化。这里介绍的是模式匹配的基本知识。

样本类(case class)

添加了case关键字的类便是样本类。例如

abstract class Expr
case class Var(name:String) extends Expr
case class Number(num:Double) extends Expr
case class UnOp(operator : String , arg : Expr) extends Expr
case class BinOp(operator : String , left : Expr , right : Expr) extends Expr

这种修饰符可以让Scala编译器自动为这个类添加一些语法糖的效果:

  • 添加与类名一致的工厂方法。也就是说,可以写成Var("x")来构造Var对象,而不用new。
  • 样本类参数列表中的所有参数隐式获得了val前缀,因此它被当作字段维护。
  • 编译器为这个类添加了方法toString,hashCode和equals等方法。

模式匹配

模式匹配的例子如下:

def simplifyTop(expr : Expr) : Expr = expr match{
  case UnOp("-" , UnOp("-" , e)) => e
  case BinOp("+" , e , Number(0)) => e
  case BinOp("*" , e , Number(1)) => e
  case _ => expr
}

这里的match对应Java里的switch,但是写在选择器表达式之后。即:

 选择器 match {备选项}。

一个模式匹配包含了一系列备选项,每个都开始于关键字case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。

Scala中匹配表达式可以被看作Java风格Switch的泛化。但有三点不同:

  • match是Scala的表达式,始终以值作为结果;
  • Scala的备选项表达式永远不会落入下一个case;
  • 如果没有模式匹配,MatchError异常会被抛出。这意味着必须始终确信所有的情况都考虑到了,或者至少添加一个默认情况什么都不做。如 case _ =>

模式的种类

具体说,有这么几种匹配模式

常量模式

区分一些常量

def describe(x: Any) = x match {
    case 5 => "five"
    case true => "truth"
    case "hello" => "hi!"
    case Nil => "the empty list"
    case _ => "something else"
  }

  match表达式通过以代码编写的先后次序尝试每个模式来完成计算。

变量模式

单纯的变量模式没有匹配判断的过程,只是把传入的对象给起了一个新的变量名。通常不会单独使用,而是在多种模式组合时使用,比如

List(1,2) match{ case List(x,2) => println(x) }

构造模式

它的存在使得模式匹配真正变得强大。它由名称及若干括号之内的模式构成。如BinOp("+" , e , Number(0))。这种模式对于树型递归数据尤其有用。下面的序列模式和元组模式也可以认为是构造模式的特例。

序列模式

可以像匹配样本类那样匹配List或Array这样的序列类型。同样的语法现在可以指定模式内任意数量的元素。如:

expr match{
   case List(0 , _ , _ ) => println("found it")
   case _ => 
 }

如果想匹配一个不指定长度的序列,可以指定_*作为模式的最后元素。它能匹配序列中0到任意数量的元素。

元组模式

def tupleDemo(expr : Any) = 
  expr match {
    case (a , b, c) => println("matched " + a + b + c)
    case _ => 
  }

类型模式

def generalSize(x : Any) = x match{
  case s : String => s.length
  case m : Map[_ , _] => m.size
  case _ => 1
}
0
3
分享到:
评论

相关推荐

    scala-intellij-bin-2020.3.14.zip

    5. **Scala编程基础**: Scala语言引入了许多高级编程概念,如模式匹配、高阶函数、类型系统和 Actors 模型。使用IntelliJ IDEA的Scala插件,开发者可以方便地编写和调试这些特性,同时利用IDE提供的代码提示和错误...

    scala入门--文档版本

    - **函数式编程**: 它支持高阶函数、模式匹配等函数式编程特性。 - **静态类型**: 虽然Scala有自动类型推断功能,但它本质上仍然是一种静态类型的编程语言。 - **简洁**: 与Java相比,Scala通常需要更少的代码行...

    Scala-2.11.1.zip

    6. **模式匹配**:Scala的模式匹配允许开发者在代码中解构复杂的对象和数据结构,使其能够优雅地处理多种情况。 7. **类型类**:类型类是一种在运行时发现和组合类型特性的设计模式,它允许在不使用传统继承的情况...

    大数据课程-Scala编程基础-5.Scala模式匹配_lk_edit.ppt

    本课程内容涵盖多个关键概念,如模式匹配、样例类、隐式函数和异常处理及泛型,这些都是Scala语言强大特性的体现。 首先,Scala的模式匹配是一种强大的控制流构造,类似于Java中的switch语句,但更为灵活。它允许...

    scala-SDK-4.7.0-vfinal-2.12-macosx.cocoa.x86_64

    在使用Scala SDK时,开发者可以利用其强大的函数式编程特性,例如高阶函数、模式匹配、不可变数据结构等,同时也可以利用面向对象编程的特性,如类、对象和继承。Scala还支持类型推断,这意味着程序员不必总是显式地...

    scala-2.13.8 解压安装版

    - **模式匹配**:通过模式匹配,可以对数据结构进行解构并根据不同的情况执行不同的操作。 - **案例类**:简化了模式匹配,它们自动提供unapply方法,用于匹配。 - **Actor模型**:Scala内建对Akka Actor的支持,...

    scala-docs-2.11.1.zip

    1. **语言指南**:这部分详细解释了Scala的基本语法、控制结构、类与对象、函数、模式匹配等核心概念,是学习Scala语法的起点。 2. **标准库文档**:展示了Scala库中各种类和方法的API,包括集合库、并发工具、IO...

    scala-doc-2.11.8 原版

    1. **基础语法**:Scala的基础语法与Java有很多相似之处,但也有其独特的特点,如模式匹配、高阶函数、类型推断和case类。文档会详细解释这些概念,帮助初学者快速上手。 2. **类型系统**:Scala有一个强大的静态...

    scala sdk scala-2.12.3

    7. **类型系统**:Scala拥有强大的类型系统,包括类型推断、模式匹配、高阶类型和抽象类型等,这使得编写安全且可维护的代码成为可能。 8. **面向对象编程**:Scala支持传统的类、继承、封装和多态性,同时也引入了...

    Scala编程详解 第18讲-Scala编程详解:模式匹配 共11页.pptx

    共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...

    scala-423-n

    4. 特性(Feature):Scala允许开发者使用模式匹配、匿名函数、case类和object来增强代码的可读性和表达力。此外,它还提供了 Actors 模型,用于并发编程,确保线程安全。 5. 集合库:Scala的标准库包含一个高效且...

    Spark 编程基础(Scala 版)-机房上机实验指南

    - **函数式编程**:支持高阶函数、模式匹配等函数式编程特性,这些特性对于编写高效、可维护的Spark程序至关重要。 #### Spark与Scala的集成 - **环境搭建**: - **安装Scala**:确保Scala版本与Spark兼容。 - *...

    快学Scala完整版&Scala编程(中文版)&Scala程序设计-多线程编程实践

    它可能涵盖了变量声明、基本数据类型、类与对象、模式匹配、高阶函数、类型系统、特质(trait)等主题,这些都是Scala编程的基石。此外,这本书还可能深入到Akka框架的介绍,因为Akka是Scala中用于构建分布式、反应...

    大数据课程-Scala编程基础-2.Scala语言基础_lk_edit.ppt

    至于控制结构语句,Scala提供了if/else、for循环、while循环、do/while循环等,以及模式匹配等高级特性。例如: ```scala val score = 90 val grade = if (score >= 90) "A" else "B" for (i <- 1 to 5) println(i)...

    scala-2.7.5.final

    4. **模式匹配**:Scala的模式匹配不仅用于case语句,还可以在变量声明、函数参数和解构赋值中使用,增强了代码的可读性和可维护性。 5. ** Actors模型**:在2.7.5版本中,Scala内置了Actors模型,这是一种并发编程...

    快学Scala课后习题答案

    3. **模式匹配**:Scala中的模式匹配是一种强大的控制流构造,可以用于解构复杂数据结构。例如,`case (a, b) => a + b` 是一个简单的模式匹配例子。 4. **高阶函数**:函数在Scala中是第一类公民,可以作为参数...

    jdbi-scala_2.9.1-0.2.0.zip

    当Jdbi与Scala结合,我们可以利用Scala的强大特性,如模式匹配、类型推断等,来编写更加优雅的数据库访问代码。 在“jdbi-scala.zip”压缩包中,包含的“jdbi-scala-master”文件可能是一个Git仓库的主分支,通常...

    Scala 专题教程 - Extractor-内含源码以及设计说明书(可以自己运行复现).zip

    Extractor是Scala中的一个核心概念,主要用于模式匹配。在这个“Scala专题教程 - Extractor”中,我们将深入探讨Extractor的工作原理、如何创建自定义Extractor以及它们在实际编程中的应用。 ### 1. Scala模式匹配 ...

    scala-db-codegen:来自数据库模式的Scala代码模板生成器

    通过结合 `scala-db-codegen`,开发者可以自动生成与数据库模式匹配的 Quill 模式,从而轻松地进行数据库操作。 标签中的 "code-generator" 和 "code-generation" 明确表示了这是一个代码生成工具。`scala-db-...

    图灵书籍(Scala程序设计(第2版).pdf+Scala程序设计-JAVA虚拟机多核编程实战.pdf)

    Scala程序设计(第2版)很可能详尽地介绍了Scala的基本语法、类与对象、模式匹配、高阶函数、类型系统、并发编程等核心概念,以及可能包含了一些新的语言特性或最佳实践。 **JAVA虚拟机多核编程实战** 这本书则关注...

Global site tag (gtag.js) - Google Analytics