Scala语言入门四(模式匹配)

简介: Scala中的模式匹配讲解

Scala 提供了强大的模式匹配机制,应用也非常广泛。一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式

一、语法

变量 match {
    case value1 => 代码1
    case value2 => 代码2
    ...
}

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

match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配

二、简单案例

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]) {
    // 打印 many
    println(matchTest(3))
  }

  def matchTest(x: Int): String = x match {
    case 1 => "one"
    case 2 => "two"
    case _ => "many"
  }
}

三、类型匹配

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]) {
    println(matchTest2("test"))
    println(matchTest2(6))
  }

  def matchTest2(x: Any): Any = x match {
    case x: String => "Scala.String"
    case y: Int => "scala.Int"
    case _ => "many"
  }
}

实例中第一个 case 对应整型数值 1,第二个 case 对应字符串值 two,第三个 case 对应类型模式,用于判断传入的值是否为整型,相比使用isInstanceOf来判断类型,使用模式匹配更好。第四个 case 表示默认的全匹配备选项,
即没有找到其他匹配时的匹配项,类似 switch 中的 default

四、条件匹配

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]) {
    println(matchTest3(1))
    println(matchTest3("hello"))
    println(matchTest3(2))
  }

  def matchTest3(value: Any): Any = value match {
    case 1 => "输入的是:1"
    case _ if (value.equals("hello")) => "world"
    case _ => value
  }
}

如果输入的不是1,那么会先进行条件判断,满足第二个case的话会走第二个case,否则会走最后一个case

五、数组匹配

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]) {
    // 满足第一个case
    println(matchTest4(Array(1)))
    // 不满足第一个和第二个
    println(matchTest4(Array(1,2)))
    // 满足第二个
    println(matchTest4(Array(2)))
  }

  def  matchTest4(x: Array[Any]): Int = x match {
    case Array(1) => 1
    case Array(2, _*) => 666
    case _ => 0
  }
}

六、List匹配

和数组过滤类似,这里不再讲解,可以自己玩几把

七、样例类匹配

使用了case关键字的类定义就是就是样例类(case class),样例类是种特殊的类,经过优化以用于模式匹配

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]): Unit = {
    println(matchTest5(Person("张三")))
    println(matchTest5(Person("李四")))
    println(matchTest5(Person("老王")))
  }

  def matchTest5(x:Person):String = x match {
    case Person("张三") => "张三"
    case Person("李四") => "李四"
    case _ => "xx"
  }
}

// 样例类
case class Person(name: String)

八、异常处理

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]): Unit = {
    try {
      val i = 10 / 0
      println(i)
    } catch {
      case e: ArithmeticException => println("除数不能为0")
      case e:Exception => println("最大异常")
    }finally {
      // 资源释放的东西,和java类似
    }
  }
}
目录
相关文章
|
4月前
|
分布式计算 Java Hadoop
Scala入门必刷的100道练习题(附答案)
Scala入门必刷的100道练习题(附答案)
272 1
|
4月前
|
Java 大数据 Scala
Scala入门【运算符和流程控制】
Scala入门【运算符和流程控制】
|
4月前
|
Java Shell API
Scala入门【变量和数据类型】
Scala入门【变量和数据类型】
|
6月前
|
安全 Java 编译器
Scala语言入门:初学者的基础语法指南
作为一种在Java虚拟机(JVM)上运行的静态类型编程语言,Scala结合了面向对象和函数式编程的特性,使它既有强大的表达力又具备优秀的型态控制
27 0
|
11月前
|
JavaScript 前端开发 Java
Scala语言入门以及基本语法
Scala语言入门以及基本语法
|
分布式计算 Java 程序员
spark开发基础之从Scala符号入门Scala
spark开发基础之从Scala符号入门Scala
137 0
spark开发基础之从Scala符号入门Scala
|
开发框架 IDE Java
体验 Scala 语言的 Play Web 框架
体验 Scala 语言的 Play Web 框架
体验 Scala 语言的 Play Web 框架
|
SQL 存储 NoSQL
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
198 0
|
SQL 存储 NoSQL
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
基于JVM的开源数据处理语言主要有Kotlin、Scala、SPL,下面对三者进行多方面的横向比较,从中找出开发效率最高的数据处理语言。本文的适用场景设定为项目开发中常见的数据处理和业务逻辑,以结构化数据为主,大数据和高性能不作为重点,也不涉及消息流、科学计算等特殊场景。......
192 0
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
|
开发框架 分布式计算 Java
十分钟带汝入门大数据开发语言Scala
Scala是一门多范式的编程语言,一种类似Java的编程语言 ,设计初衷是实现可伸缩的语言 、并集成面向对象编程和函数式编程的各种特性。目前最主流的大数据开发框架Spark的实现就是通过Scala去实现的。Scala可以与Java互操作。它用scalac这个编译器把源文件编译成Java的class文件(即在JVM上运行的字节码),也可以从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的代码。
十分钟带汝入门大数据开发语言Scala