zoukankan      html  css  js  c++  java
  • 模式匹配

    模式匹配

    1. 模式匹配:就是对变量的进行判断,针对不同的条件进行不同的处理
    2. 模式匹配的关键点:变量A中的数据类型包含case中所有的数据类型(变量A的数据类型是模式匹配中类型xx的向上转型)
    3. 模式匹配的几种情况:
      1. 对值进行匹配 
      2. 对数据类型进行匹配 :基本语法(变量A match {case 变量: 类型 => 代码})
      3. 对集合数组进行匹配(如:Array和List)
      4. 对case class 进行模式匹配
      5. 对Option[T]进行模式匹配
      6. 模式匹配和高级函数连用:基本语法     list.map{case xxx => 函数体} (list中的每一个值都进行一次模式匹配)
    4. match case 的基本语法:变量A match {case xx => 代码块}    模式匹配从上往下匹配,只要case 满足条件,就不会继续匹配判断下面的分支了
    5. 如果上面所有情况下的都没有匹配到,最后用_表示其他类型。(默认是_,也可以用其他的变量名)
    6. 模式匹配可以在case后的条件里面再加一个if条件
    7. 如果匹配到的是一个变量名称xx,则就会将匹配值A赋值给这个变量xx
    8. 在高阶函数中使代码更具有可读性

    值匹配

    对值进行模式匹配
       object valueTest{
            def main(args: Array[String]): Unit = {
              def Score(score:String): Unit ={
                score match {
                  case "A"=>println("very good")
                  case "B"=>println("good")
                  case "C"=>println("just soso")
                  case other  =>println("terrible")     //默认是_,也可以用其他的变量名
                }
              }
              Score("D")
            }
          }
    在模式匹配中使用if守卫:在case后的条件里面再加一个if条件
    object valueTest{
          def main(args: Array[String]): Unit = {
            def Score(name:String,score:String): Unit ={
              score match {
                case "A"=>println("very good")
                case "B"=>println("good")
                case "C"=>println("just soso")
                case _ if name=="James"=>print(s"come on !!!  $name")   //if守卫
                case _ =>println("terrible")
              }
            }
            Score("James","F")
          }
        }
    在模式匹配中进行变量赋值:如果模式匹配的默认情况为一个变量名xx,则就会将要匹配的值A赋值给这个变量xx,可以在后面的处理语句中使用该值
    object valueTest{
          def main(args: Array[String]): Unit = {
            def Score(name:String,score:String): Unit ={
              score match {
                case "A"=>println("very good")
                case "B"=>println("good")
                case "C"=>println("just soso")
                case _ if name=="James"=>print(s"come on !!!  $name")
                case other  =>println("terrible, you just "+other)  //变量赋值
              }
            }
            Score("Jamues","F")
          }
        }

    数据类型匹配

    基本语法:变量A match {case 变量: 类型 => 代码}
    //变量Excep的数据类型是模式匹配中类型excipn的父类
    object ExceptionTest{
      def main(args: Array[String]): Unit = {
        import java.io._
        def funException(Excep: Exception) {
          Excep match {
            case excip1: IllegalArgumentException => println(excip1)
            case excip2: FileNotFoundException => println( excip2)
            case excip3: IOException => println( excip3)
            case _: Exception => println("............" )
          }
        }
        funException(new IOException("..."))
      }
    }

    集合数组匹配

    1. 可以匹配带有指定元素的数组
    2. 特定结构
    3. 以某元素打头的数组
    object ArrayTest{
      def main(args: Array[String]): Unit = {
        def playBall(arr: Array[Any]) {
          arr match {
            case Array("basketball") => println("play basketball")  //匹配一个元素
            case Array(ball1,(ball2,ball3)) => println("一个单个元素,一个二元组") //匹配特定结构
            case Array("ball", _*) => println("ball start ") //匹配以ball开头
            case _ => println("hey, who are you?")
          }
        }
        playBall(Array("ball"))
      }
    }

    case class匹配

    变量person是case中匹配对象的父类

    class Person
    case class Teacher(name: String, subject: String) extends Person
    case class Student(name: String, classroom: String) extends Person
    object MatchTest {
        def main(args: Array[String]): Unit = {
          def judgeIndentity(person: Person): Unit = {
            person match {
              case Teacher(name, subject) => println(s"name = $name, subject = $subject")
              case Student(name, classroom) => println(s"name = $name, classroom = $classroom")
              case _ => println("........................")
            }
          judgeIndentity(Student("xz", "1001"))
        }
      }
    }

    Option[T]匹配

    Option[T]用在模式匹配中用来判断变量是否有值(对有值和无值做不同的处理)
    object OptionTest{
      def main(args: Array[String]): Unit = {
        val person = Map(("Tom",15),("Wiki",26))
        val age: Option[Int] = person.get("Toms")
          age match {
            case Some(grade) => println(s" is ${age.get} years")
            case None => println("who are you")
          }
      }
    }

     模式匹配和高级函数连用

    1. 基本语法: list.map{case xxx =>  函数体}
    2. list中的每一个值都进行一次模式匹配
    3. 在高阶函数中使代码更具有可读性
    object MatchTest {
        def main(args: Array[String]): Unit = {
          // 将列表中字母变成大写
          val list  = List((1, ("aa", 11)), (2, ("bb", 22)), (3, ("cc", 33)))
          list.map(item => (item._1, (item._2._1.toUpperCase, item._2._2)))
    
          // 模式匹配使代码更具有可读性
          list.map{
            case (id,(na,ages)) =>(id,(na.toUpperCase(),ages))
          }
      }
    }
  • 相关阅读:
    MapReduce 中的Map后,sort不能对中文的key排序
    wordCount程序中MapReduce工作过程分析
    使用eclipse的快捷键自动生成的map或者reduce函数的参数中:“org.apache.hadoop.mapreduce.Reducer.Context context”
    "hadoop namenode -format"命令的作用和影响的文件
    伪分布模式下使用java接口,访问hdfs
    MySQL Server 5.5.44免安装版配置详解
    quartz Cron表达式一分钟教程
    【转载】jQuery弹出层始终垂直居中于当前屏幕
    LeetCode 151 翻转字符串里的单词
    LeetCode 43 字符串相乘
  • 原文地址:https://www.cnblogs.com/WeiKing/p/11594967.html
Copyright © 2011-2022 走看看