Scala基础知识笔记6-模式匹配和Option

时间:2022-05-30 07:00:01

 

 

  // ------------------------  scala 模式匹配 match case ----------------------------------
    /**
      * 类似于java中的 switch case  ,java中switch case只能对值进行匹配,但scala的 match case 能对如下进行判断,范围更广
      * 同时和java中switch case的另一个区别是 ,java的switch case需要使用break才能阻止,但scala的是只要有一个case分支满足并处理了,就不会继续判断下一个case分支了
      * 1 对值进行匹配
      * 2 对类型进行匹配
      * 3 对Array和list元素进行匹配
      * 4 对case class进行匹配
      * 5 对有值没值进行匹配
      * 值为下划线 _,则代表了不满足以上所有情况下的默认情况如何处理
      *
      * match case if 在同一种情况下 进行更细致的划分
      * 针对 _  如果需要在case后得到这个具体的_的值,那么需要将下划线,替换为一个变量名,此时模式匹配语法就会将要匹配的值赋值给这个变量 然后在case 后饮用这个变量名即可得到
      *  否则我们也不知道这个_对应的具体的值是什么
      *
      *  option :  Some(a) 表示一定有值 、None表示没有值 
      */

    // 对值进行匹配
    def judgeScore(grade:String): Unit = {
      grade match{
        case "A"  => printf("Excellent")
        case "B"  =>  printf("Good")
        case "C"  =>  printf("Just so so")
        case _  =>  printf("you need work hard")
      }
    }

    // 对值进行匹配 增加if守卫 进行双重过滤
    def judgeScore1(grade:String, name:String): Unit = {
      grade match{
        case "A" => printf("Excellent")
        case "B" => printf("Good")
        case "C" => printf("Just so so")
        case _ if name == "zm" => printf(name + "you are Good")
        case _ => printf("you need work hard")
      }
    }

    //judgeScore1("F","zm1")


    import java.io._
    // 对类型进行匹配   case 变量:类型 => 代码模式
    def processException (e:Exception): Unit = {
      e match {
        case e1:IllegalArgumentException => printf("the exception is IllegalArgumentException: " + e1)
        case e2:FileNotFoundException => printf("the exception is FileNotFoundException: " + e2)
        case e3:IOException => printf("the exception is IOException: " + e3)
        case _:Exception =>  printf("the other excepion happended " )
      }




      // 对Array数组进行匹配  匹配指定个数的数组  匹配以某个元素开头的数组  匹配带有指定元素的数组   这个效果没模拟出来
      def greetArray(arr:Array[String]): Unit = {
        arr match {
          case Array("Leo") => printf("hello, Leo ")
          case Array(name1,name2,name3) => printf("the people name is" + name1 + " " + name2 + " " + name3)
          case Array("Leo",_*) => printf("hi,Leo, tell me you friends")
          case _ => print("hi,how are you")
        }
      }

      greetArray(Array("1","2","3")) // 针对数组调用 没有模拟出来


      // scala中的 option 和模式匹配
      /**
        * option只有两种值  一种是Some 表示有值,  一种是None 表示没值
        * scala中使用 option 用于模式匹配中表示有值没值要比 Null更显得简洁
        */
      var personGrade = Map("zm"->"13","liang"->"7")
      var grade = personGrade.get("zm").get
      print(grade)
      println(12345)

      def getGrade(name:String): Unit = {
        var grade = personGrade.get(name)
        grade match {
          case Some(grade) => print("you grade is " + grade)
          case None => print("you are not here ")
        }
      }

      getGrade("zm2")
    }






object Test {

  def main(args: Array[String]): Unit = {
    var personGrade = Map("zm"->"13","liang"->"7")
    //println(personGrade)
   //print( personGrade.get("zm").get )

    def getGrade(name:String): Unit = {
      var grade = personGrade.get(name)
      grade match {
        case Some(grade) => print("you grade is " + grade)
        case None => print("you are not here ")
      }
    }

   // getGrade("zm")  // 结果  you grade is 13

    // 对Array数组进行匹配  匹配指定个数的数组  匹配以某个元素开头的数组  匹配带有指定元素的数组   这个效果没模拟出来
    def greetArray(arr:Array[String]): Unit = {
      arr match {
        case Array("Leo") => printf("hello, Leo ")
        case Array(name1,name2,name3) => printf("the people name is" + name1 + " " + name2 + " " + name3)
        case Array("Leo",_*) => printf("hi,Leo, tell me you friends")
        case _ => print("hi,how are you")
      }
    }

    greetArray(Array("Leo")) // 针对数组调用 没有模拟出来
  }


}