Scala的模式匹配是通过match表达式从若干可选项中选择,类似Java中的switch。
例子:
val firstArg = if(args.length>0) args(0) else "" firstArg match{ case "salt" => println("pepper"); case "chips" => println("salsa"); case "eggs" =>println("bacon"); case _ => println("huh?"); //缺省的样例以 _ 表示 }
如果我们要访问匹配的输入参数使用unexpected来访问
val colorNum = 4; val colorStr = colorNum match{ //将匹配后的结果保存在colorStr中 case 1 => "red" case 2 => "green" case 3 => "yellow" case unexpected => unexpected + "is Not Allowed"
//unexpected代表colorNum=4 }
我们还可以在匹配中使用“守卫”,也就是if来添加一些必要的处理逻辑。
for(elem <- List(1,2,3,4)){ elem match{ case _ if(elem %2 ==0) => println(elem + " is even.") case _ => println(elem+" is odd.") } }
注意,上例我们使用的是 case _ if 的意思是所有的elem都进来,然后进行if的判断。
其实我们常见的map遍历也是使用了模式匹配。
val map = Map("zhang" -> 1,"yu" -> 2,"hang" -> 3); for((k,v) <- map){//遍历map println("("+k+","+v+")"); }
我们还可以使用case类来优化用于模式匹配的类。
case class Car(brand:String,price:Int){ val myBYDCar = new Car("BYD",10000); val myBMWCar = new Car("BWM",20000); val myBENZCar = new Car("BENZ",30000); for(car <- List(myBYDCar,myBMWCar,myBENZCar)){ car match { case Car("BYD",10000) => println("BYD's price is "+car.price) case Car("BWM",20000) => println("BMW's price is "+car.price) case _ => println("BENZ's price is "+car.price) } } }
Scala的match表达式跟JAVA的switch的区别
1.Scala是任何常量、字符串等都可以用作样例,JAVA的case语句只支持整型、枚举和字符串常量。
2.Scala中break是隐含的,不用直接写,JAVA需要写。
3.Scala的match表达式会返回值,每个选项都打印出一个值。