模式匹配
转载:Scala模式匹配
1. 模式匹配
Scala 支持模式匹配机制,可以代替 swith 语句、执行类型检查、以及支持析构表达式等。
1.1 更好的swith
Scala 不支持 swith,可以使用模式匹配 match...case 语法代替。但是 match 语句与 Java 中的 switch 有以下三点不同:
Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常量;
Scala 中每个分支语句后面不需要写 break,因为在 case 语句中 break 是隐含的,默认就有;
在 Scala 中 match 语句是有返回值的,而 Java 中 switch 语句是没有返回值的。如下:
object ScalaApp extends App {
def matchTest(x: Int) = x match {
case 1 => "one"
case 2 => "two"
case _ if x > 9 && x < 100 => "两位数" //支持条件表达式 这被称为模式守卫
case _ => "other"
}
println(matchTest(1)) //输出 one
println(matchTest(10)) //输出 两位数
println(matchTest(200)) //输出 other
}1.2 用作类型检查
1.3 匹配数据结构
匹配元组示例:
匹配数组示例:
1.4 提取器
数组、列表和元组能使用模式匹配,都是依靠提取器 (extractor) 机制,它们伴生对象中定义了 unapply 或 unapplySeq 方法:
unapply:用于提取固定数量的对象;
unapplySeq:用于提取一个序列;
这里以数组为例,Array.scala 定义了 unapplySeq 方法:
unapplySeq 返回一个序列,包含数组中的所有值,这样在模式匹配时,才能知道对应位置上的值。
2. 样例类
2.1 样例类
样例类是一种的特殊的类,它们被经过优化以用于模式匹配,样例类的声明比较简单,只需要在 class 前面加上关键字 case。下面给出一个样例类及其用于模式匹配的示例:
当你声明样例类后,编译器自动进行以下配置:
构造器中每个参数都默认为
val;自动地生成
equals, hashCode, toString, copy等方法;伴生对象中自动生成
apply方法,使得可以不用 new 关键字就能构造出相应的对象;伴生对象中自动生成
unapply方法,以支持模式匹配。
除了上面的特征外,样例类和其他类相同,可以任意添加方法和字段,扩展它们。
2.3 用于模式匹配
样例的伴生对象中自动生成 unapply 方法,所以样例类可以支持模式匹配,使用如下:
3. 参考资料
Martin Odersky . Scala 编程 (第 3 版)[M] . 电子工业出版社 . 2018-1-1
凯.S.霍斯特曼 . 快学 Scala(第 2 版)[M] . 电子工业出版社 . 2017-7
最后更新于
这有帮助吗?