理解scala的模式匹配首先需要理解“模式匹配是什么”?
这里的模式不是指的设计模式中的模式的意思,而是指一定的规则,跟“正则表达式”类似。
维基字典:模式匹配,也称为串匹配(string matching, pattern matching),就是给定一组特定的字符串集合P,对于任意的一个字符串T,找出P中的字符串在T中的所有出现位置。我们称P为模式串集合,称P中的元素为模式串(或关键词),称T为文本。字符串中的字符都取自一个有限的符号集合Σ ,简称字母表或字符集。
比喻一下就是从一个拼图里找到与另一个拼图中存在的匹配图片。
往宽泛了讲,就是给定一个匹配的模式规则,凡是符合规则的就算是匹配上了。
这些规则在scala中都有以下几种:
1.常量模式constant patterns,包含常量字面量和常量变量
常量字面量 scala> val a = 1000 a: Int = 1000 scala> a match {case 1000 => println("match")} match 常量变量 scala> val A="a" A: String = a scala> def foo(a:String){a match {case A => println("match")}} foo: (a: String)Unit scala> foo("a") match
2.通配符模式wildcard patterns
通配符用下划线表示:"_" ,可以理解成一个特殊的变量或占位符。
scala> Array(1,2,3) match{case Array(1,2,_) => println("ok")} ok
上边的通配符_表示可以匹配任一类型,只要前边匹配上就可以。
3.类型模式type patterns
类型模式匹配跟java的instanceOf效果一样,判断是否是同一种类型。
scala> a match{case _:Int => println("match")} match
4.构造器模式constructor patterns
我们来做一个较为复杂的测试,构造一个二叉树结构来体现一下构造器模式匹配的威力,在命令行中输入:paste
scala> :paste // Entering paste mode (ctrl-D to finish) //定义抽象节点 trait Node //具体的节点实现,构造函数有两个子节点 case class TreeNode(V:String,left:Node,right:Node) extends Node //定义Tree构造参数是root根节点 case class Tree(root:TreeNode) // Exiting paste mode, now interpreting. defined trait Node defined class TreeNode defined class Tree
接来下构造一个根节点含有左右两个子节点的树Tree
scala> val tree = Tree(TreeNode("root",TreeNode("left",null,null),TreeNode("righ t",null,null))) tree: Tree = Tree(TreeNode(root,TreeNode(left,null,null),TreeNode(right,null,nul l)))
然后我想得到匹配一棵树的左节点为“left”右节点为“right”且右节点没有子节点的树结构的时候我们可以这么写:
scala> tree.root match{case TreeNode(_,TreeNode("left",_,_),TreeNode("right",nul l,null)) => println("match")} match
这样的结果使用一行代码较为简单地就实现了,如果用java可能需要更多的代码量。
5.变量绑定模式 variable binding patterns
用上边的TreeNode来举个例子,我希望匹配到右节点为“right”的时候返回该节点,那么我就给这个节点绑定一个变量返回。
scala> tree.root match{case TreeNode(_,_,rightNode@TreeNode("right",_,_)) => rig htNode} res7: TreeNode = TreeNode(right,null,null)
其中的@符号用于绑定匹配成功之后赋值给rightNode,然后返回。