zoukankan      html  css  js  c++  java
  • 【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表达式会返回值,每个选项都打印出一个值。

  • 相关阅读:
    利用npm 安装删除模块
    C#比较类/接口、Dictionary 排序
    关于二叉树的一些基本知识
    关于前端JS的一些常用方法和知识
    组装Json数据的一种简单办法(不用Stringbuilder方法)
    windows环境下Kubernetes及Docker安装(那些坑)
    七夕给自己的礼物-上线排盘小程序
    Asp.net 自定义CustomerSession 存放到Redis中
    CodeTimer 代码性能计数器
    我虽码农,亦不搬砖
  • 原文地址:https://www.cnblogs.com/zzhangyuhang/p/8886786.html
Copyright © 2011-2022 走看看