美文网首页
快速学习Scala之模式匹配

快速学习Scala之模式匹配

作者: 固安李庆海 | 来源:发表于2018-09-28 09:34 被阅读2次

    模式匹配是Scala中非常有特色且强大的功能。模式匹配类似于Java中的swich case语法即对一个值进行条件判断,针对不同的条件进行不同的处理。

    但是Scala的模式匹配的功能比Java的swich case语法的功能要强大地多,Java的swich case语法只能对值进行匹配。Scala的模式匹配除了可以对值进行匹配之外,还可以对类型进行匹配、对Array和List的元素情况进行匹配、对case class进行匹配、甚至对有值或没值(Option)进行匹配。

    模式匹配语法

    scala使用match case的语法进行模式匹配。

    变量 match { 
      case 值1 => 代码
      case 值2 => 代码
      case _ => 代码
    }。
    

    如果值为下划线,则代表了不满足以上所有情况下的默认情况如何处理。
    此外,match case中,只要一个case分支满足并处理了,就不会继续判断下一个case分支了。

    变量值的模式匹配

    基本用法

    使用case 值 => 代码这种语法进行值的模式匹配。

    def convert(number : Int) : String = {
        number match {
          case 1 => "壹"
          case 2 => "贰"
          case 3 => "叁"
          case 4 => "肆"
          case 5 => "伍"
          case 6 => "陆"
          case 7 => "柒"
          case 8 => "捌"
          case 9 => "玖"
          case 10 => "拾"
          case _ => "错误"
        }
    }
    

    带if守卫

    Scala的模式匹配语法可以在值后面再加一个if守卫进行双重过滤。

    def performanceRating(score : Int) : String = {
        score match {
          case s if (score >= 90) => "优秀"
          case s if (score >= 80) => "良好"
          case s if (score >= 70) => "尚可"
          case s if (score >= 60) => "及格"
          case _ => "差"
        }
    }
    

    类型的模式匹配

    使用case 变量: 类型 => 代码这种语法进行类型的模型匹配。

    try{
          
    }catch{
        case e:IllegalArgumentException=> do something
        case e:FileNotFoundException=> do something
        case e:IOException => do something
        case _:Exception => do something
    }
    
    

    case class的模式匹配

    //定义客户类
    class Customer
    //定义个人用户
    case class PersonalUser(name:String) extends Customer
    //定义企业用户
    case class EnterpriseUser(name:String) extends Customer
    //定义Vip用户
    case class VipUser(name:String) extends Customer
    ...
    /**
      * 提供的服务
      */
    def service(c:Customer):Unit={
        c match{
          case EnterpriseUser(_)=>print("对公业务")
          case PersonalUser(_)=>print("对私业务")
          case VipUser(_)=>print("对Vip业务")
          case _ =>print("?")
        }
    }
    

    Option的模式匹配

    Scala有一种特殊的类型Option,Option有两种值,一种是Some,表示有值,一种是None,表示没有值。Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁明了。

    val grades = Map("张三" -> "A", "李四" -> "B", "王五" -> "C", "赵大" -> "C")
    //成绩查询
    def getGrade(name: String) {
      val grade = grades.get(name)
      grade match {
        case Some(grade) => println("你的成绩是 " + grade)
        case None => println("对不起,未找到相关成绩,请联系老师")
      }
    }
    

    数组的模式匹配

    def arrayMatch(arr : Array[Int]) : String = {
        arr match {
          case Array(_) => "匹配只有一个元素的情况"
          case Array(x, y) => "匹配有两个元素的情况"
          case Array(0, _*) => "匹配从0开始的情况"
          case _ => "其他情况"
        }
    }
    

    List 的模式匹配

    def listMatch(list : List[String]) = list match {
        case head :: Nil => "匹配只有一个元素的情况"
        case x :: y :: Nil => "匹配只有两个元素的情况"
        case "丽丽" :: tail => "匹配以丽丽开始的情况"
        case head :: tail => "匹配多个元素的情况"
        case _ => "其他情况"
    }
    

    Tuple的模式匹配

    def tupleMatch(t : Tuple2[String, String]) : String = t match {
        case ("A", _) => "匹配以A开始的二元组"
        case (_, "A") => "匹配以A结束的二元组"
        case _ => "其他情况"
    }
    

    相关文章

      网友评论

          本文标题:快速学习Scala之模式匹配

          本文链接:https://www.haomeiwen.com/subject/mxyuoftx.html