【scala】模式匹配

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表达式会返回值,每个选项都打印出一个值。

原文地址:https://www.cnblogs.com/zzhangyuhang/p/8886786.html