文章作者:梦家
个人站点:dreamhomes.top
原文地址:https://dreamhomes.top/707.html
公众号ID:DreamHub
本文介绍 Scala 中的模式匹配与异常处理,这两部分内容放在一起的原因是 Scala 中的异常处理是利用模式匹配的思想!
在 Jupyter
中学习效果更加哦!传送门~
Scala 模式匹配
Scala 提供了强大的模式匹配机制,一个模式匹配包含了一系列备选项,每个都开始于关键字 case
。每个备选项都包含了一个模式及一到多个表达式。箭头符号 =>
隔开了模式和表达式。
// 模式匹配实例
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
println(matchTest(3))
many
match
对应 Java 里的 switch
,但是写在选择器表达式之后。即: 选择器 match {备选项}
。
match
表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的 case
,剩下的case
不会继续匹配。
//不同数据类型的模式匹配
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
println(matchTest(6))
2
many
one
scala.Int
使用样例类
使用了case
关键字的类定义就是就是样例类(case classes),样例类是种特殊的类,经过优化以用于模式匹配。
// 实例
// 样例类
case class Person(name: String, age: Int)
val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)
for (person <- List(alice, bob, charlie)) {
person match {
case Person("Alice", 25) => println("Hi Alice!")
case Person("Bob", 32) => println("Hi Bob!")
case Person(name, age) =>
println("Age: " + age + " year, name: " + name + "?")
}
}
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?
Scala 异常处理
Scala 的异常处理和其它语言比如 Java 类似。
Scala 的方法可以通过抛出异常的方法的方式来终止相关代码的运行,不必通过返回值。
抛出异常
Scala 抛出异常的方法和 Java一样,使用 throw
方法,例如,抛出一个新的参数异常:
throw new IllegalArgumentException
捕获异常
异常捕捉的机制与其他语言中一样,如果有异常发生,catch
字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处。
捕捉异常的 catch
子句,语法与其他语言中不太一样。在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch
的代码里,是一系列case
字句,
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
try {
val f = new FileReader("none-input.txt")
} catch {
case ex: FileNotFoundException =>{
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
}
Missing file exception
finally 语句
finally
语句用于执行不管是正常处理还是有异常发生时都需要执行的步骤
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
try {
val f = new FileReader("none-input.txt")
} catch {
case ex: FileNotFoundException =>{
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
} finally{
println("Exiting finally...")
}
Missing file exception
Exiting finally...