知识点:
- 模式匹配
- 提取器
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}")
}
}
}
网友评论