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