【scala模式匹配】package scaladay02.com.aura
//模式匹配样例类模式匹配是Scala中非常强大的一种功能。模式匹配,其实类似于Java中的swtich case语法,即对一个值进行条件判断,然后针对不同的输入条件,进行结果处理。
//Scala的模式匹配除了可以对值进行匹配之外,还可以对类型进行匹配、对Array和List的元素情况进行匹配、对case class进行匹配、甚至对有值或没值(Option)进行匹配。
object MoShiTest {
def main(args: Array[String]): Unit = {
FuOn
}
//定义方法1
//模式匹配类似于java中的switch case
def FuOn(): Unit ={
// var sign=0
var ch:Char=‘1’
//match关键字
// val res=ch match{
// case ‘+’=>sign=1
// case ‘-’=>sign=1
// //判断此字符是否为数字
// case _ if Character.isDigit(ch)=>3
// //当以上条件都不成立则执行这个条件相当于default
// case _ =>sign=0
//
// }
// println(s"res=$res")
val ret1= ch match{
case '+' => 1
case '-' => 2
case '/'=> 3
**case _ => 4**
}
println(s"ret1:=$ret1")
}
}
注意//在scala中,如果所有的case都没有匹配到对应的值,会报错scala.MatchError:
守卫
package scaladay02.com.aura
object Guard {
def main(args: Array[String]): Unit = {
val arr=Array(1,2,3,4,5,6)
val res=for(i<- arr)yield {if (i%2==0)i}//yeild相当于重新开辟一个缓存区来存放条件执行的结果集这就是守卫
println( arr.mkString(","))
}
}
模式中的变量
package scaladay02.com.aura
//模式中的变量如果在case关键字后跟着一个变量名,那么匹配的表达式会被赋值给那个变量。case 是这个特性的一个特殊情况,变量名是**.**
object ModelVariables {
def main(args: Array[String]): Unit = {
//遍历每次输出一个字符
“hello world”.foreach(ch=>println(
ch match {
case ’ '=>“space”
//判断是否为字符
case a=>“Char:”+a
}
))
}
}
package scaladay02.com.aura
//类型匹配是模式匹配中使用最广泛的一种方式如果匹配成功,就把x赋值给对应的类型变量
object TypeMatching {
def main(args: Array[String]): Unit = {
// println(typeOps(“111112122”))
def typeOps(x:Any):Int={
//使用match来进行比对然后找到对应的项
val result=x match {
//运用对应类型的特有api进行将我们输入的转换成我们
// 需要的然后输出
case i:Int=>i
case s:String=>Integer.parseInt(s)
case z:scala.math.BigInt=>Int.MaxValue
case c:Char=>c.toInt
//当所有条件都不存在时执行此项命令
case _ =>0
}
result
}
println(typeOps("122142135"))
//println(typeOps(true))
}
}
package scaladay02.com.aura
//模式匹配进行数组、列表和元组的匹配
object PatternMatching {
def main(args: Array[String]): Unit = {
val arr=ArrayInt
arr match{
//匹配两个参数的数组
case Array(x,y)=>{
println(s"x= x , y = x,y= x,y=y")
}
//匹配以0开头的任意长的数组
case Array(0,_*)=>{
println(“0,000”)
}
case _=>{
println(“else”)
}
}
//定义一个元组Tuple4表示是有4个元素的数组
val tuple=new Tuple4(“春”,“夏”,“秋”,“冬”)
//进行一个对应
val (spring,summer,autumn,winter)=(“春”,“夏”,“秋”,“冬”)
println(spring)
}
}
package scaladay02.com.aura
//样例类 object CaseClass {
def main(args: Array[String]): Unit = {
abstract class Expr//表达式
case class Var(name:String) extends Expr //变量
case class Number(num:Double) extends Expr // Number
//operator表示逻辑处理比如+,- * / 等 arg表示表达式例如上面的VarNumber等
case class UnOP(operator:String,arg:Expr)extends Expr //a++,b–
case class BinOp(operator:String,left:Expr,right: Expr) extends Exprdef simplifyTop(expr:Expr):Expr=expr match {case UnOP ("-", UnOP ("-",e))=>e
caseBinOp("+",e,Number(0))=>e
caseBinOp("*",e,Number(1))=>e
caseVar(name)=>Var(name)
case_ =>expr}
println(simplifyTop(new UnOP("-",new Number(2.0))))
println(simplifyTop(Var("jack")))
}
}
结果:UnOP(-,Number(2.0))
Var(jack)