var sign=... val ch:Char=... ch match{ case ‘+‘=>sign=1 case ‘-‘=>sign=-1 case _=>sign=0 } //简写 sign=ch match{ .... }
添加守卫做筛选条件,例:
ch match{ case ‘+‘=>sign=1 case ‘-‘=>sign=-1 //筛选所有数字 case _ if Charavter.isDigit(ch)=>digit=Character.digit(ch,10) case _=>sign=0 }
如果case关键字后面跟着一个变量名,那么匹配的表达式会被赋值给那个变量。例如:
str(i) match{ case ‘+‘=>sign=1 ... case ch=>Character.digt(ch,10) }
对表达式的类型进行匹配,例:
obj match{ case x:Int=>x case s:String=>Integer.parseInt(s) case _:BigInt=>Int.MaxValue case _=>‘0‘ }
注:在Scala中,更倾向与使用这样的匹配模式,而不是isInstanceOf操作符;
匹配时,必须给出一个变量名,否则会拿对象本身匹配;
匹配发生在运行期,Java虚拟机的泛型是擦掉的,因此不能用类型匹配特定的Map类型
匹配数组:
arr match{
//通过这种绑定让你轻松的访问复杂结构各部份名:”析构“ //匹配包含0的数组 case Array(0)=>"0" //匹配任何带有两个元素的数组,并将这两个元素分别绑定在x和y case Array(x,y)=>x+" "+y //匹配任何以0开始的数组 case Array(0,_*)=>"0..." case _=>"someting else" }
使用List表达式或者::匹配列表:
lst match{ case 0::Nil=>"0" case x::y::Nil=>x+" "+y case 0::tail=>"0..." case _=>"something else" }
匹配元组:
pair match{ case (0,)=>"0..." case (y,0)=>y+"0" case _=>"neither is 0" }
前面的匹配数组,列表,元组功能背后的机制:提取器机制——带有对象中提取值的unapply或unapplySeq方法的对象。unapply方法提取固定数量的对象,unapplySeq提取一个序列。
如:
arr match{ case Array(0,x)=>... }
Array伴生对象就是一个提取器——定义了一个unapplySeq方法,调用时是以被执行匹配动作的表达式作为参数,而不是模式上中看上去像是参数的表达式。unapplySeq(arr)产出一个序列的值,即数组的值。
正则表达式是另一个适合用提取器的场景,注意这时的提取器不是伴生对象,而是正则表达式对象,例:正则表达式有分组时,匹配正则表达式分组
val pattern="([0-9]+) (a-z+)".r "99 bottles" match{ case pattern(num,item)=>... //num为99,item为bottles }
原文:https://www.cnblogs.com/lyq-biu/p/11972714.html