scala

scala:模式匹配

2018-12-06  本文已影响7人  Frank_8942

知识点:

  1. 模式匹配
  2. 提取器

object Scala05_Match {
  case class ClassA(a:Int)

  def main(args: Array[String]): Unit = {
    /*
    模式匹配:
    Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。
    并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配
     */
    val flag:Any = ("",2,3)
    val result =
      flag match {
        case 'a' => println("确切值匹配  必须为char字符 a ")
        case "abc" => println("确切值匹配  必须为字符串 abc ")
        case value:Int => println(s"数据类型匹配   必须为数据类型Int, 如果匹配成功则将此值赋值给变量 ${value} ")
        case Array(0,a,b) => println(s"匹配数组   匹配成功后将变量赋值给${a},${b}")
        case (a,2,b) => println(s"匹配元组  匹配成功后将变量赋值给 ${a},${b} ")
        case ClassA(a) => println("样例类匹配  本质上和数组匹配没区别,据说样例类匹配在底层做了优化")
        case value if(value.toString.length > 30) => println(s"添加守卫    将变量${flag}赋值给变量${value}, 并且还要满足守卫if的判断")
        case _ => println("_ 可以匹配任何情况")
      }
    /*
    注意点:
    1. match是表达式,其结果是一个值
    2. 在scala中,如果要进行数据类型转换, 我们更倾向于使用类型匹配,取代 isInstanceOf 方法
    3. 如果match匹配不成功,就会抛出 MatchError 异常,所以最后要添加 case _ 这个匹配规则,此匹配规则会匹配所有情况,类似与 java中的 default
    4. 与java的switch语句不同的是,scala模式匹配不会掉入下一个分支,不需要在分支语句后加 break 的处理
    5. 模式匹配中的变量必须是小写字母开头
    6. 在匹配数组,列表和元组的背后,是用到scala的提取器功能, 从对象中提取值的 unapply或unapplySeq 方法
    */



    //利用提取器赋值
    val extractor = Array(1,"b",'c')
    val Array(a1,a2,a3) = extractor
    //for循环中使用提取器赋值
    val map: Map[Int, String] = Map(1->"a",2->"b")
    for( (k,v) <- map ){
      println(s"将Properties对象的值分别赋值给 ${k} ${v}")
    }
  }
}
上一篇 下一篇

猜你喜欢

热点阅读