**1. 基本模式匹配**
```scala
val varialbe: String = "salt"
varialbe match {
case "salt" => println("salt") // salt
case "chips" => println("chips")
case "eggs" => println("eggs")
case _ => println("default") // 相當于Java的default
}
```
```scala
def matchTest(x:Int):String = x match {
case 1 => "one"
case 2 => "two"
case _=> "many"
}
println(matchTest(1)) // one
println(matchTest(1000000)) // many
```
```scala
(1,2) match {
case (x, _)=>println(x) // 不關心第二個元素
}
```
<br/>
**2. 類型匹配**
```scala
def matchTest(x:Any):String = x match {
case x:Int => "Int"
case x:String => "String"
case _=> "Any"
}
println(matchTest(1)) // Int
println(matchTest(3.14)) // Any
```
<br/>
**3. 構造器模式匹配**
```scala
// Student是一個 case class ,這里就不給出了
def matchTest(x:Student) = x match {
case Student(name, 19) => println(s"name=$name, age=19")
case Student("Tom", age) => println(s"name=Tom, age=$age")
case Student(name, age) => println(s"name=$name, age=$age")
case _=> println("no matches")
}
matchTest(Student("Jason", 19)) // name=Jason, age=19
matchTest(Student("Tome", 20)) // name=Tome, age=20
matchTest(Student("Jimmy", 20)) // name=Jimmy, age=20
```
<br/>
**4. 模式守衛**
就是在`case`后面加上`if`條件判斷。
```scala
def matchTest(x:Int):String = x match {
case i if i==1 => "one"
case i if i==2 => "two"
case _=> "many"
}
println(matchTest(3)) // many
println(matchTest(1)) // one
```
<br/>
**5. 伴生模式匹配**
```scala
class Student(var name: String, var age: Int)
object Student {
def apply(name: String, age: Int): Student = new Student(name, age)
def unapply(arg: Student): Option[(String, Int)] = {
if (arg == null) None
else Some(arg.name, arg.age)
}
}
object HelloWorld {
def main(args: Array[String]): Unit = {
def matchTest(x: Student) = x match {
case Student(name, age) if age <= 20 => println("young man")
case Student(name, age) if age > 20 => println("old man")
case _ => println("no matches")
}
matchTest(Student("Jason", 19)) // young man
}
}
```
<br/>
**6. 序列模式**
```scala
val expr = List(1, 2, 3)
expr match {
case List(x, _, _) => println(x) // 1
case _ => println("not found")
}
expr match {
// _* 作為模式的最后元素
case List(1, _*) => println("found it") // found it
case _ => println("not found")
}
```
<br/>
**7. 元組模式**
```scala
val expr = (1, 2, 3)
expr match {
case (a, b, c) => println(a, b, c) // (1,2,3)
case _ => println("not found")
}
```
<br/>
**8. 變量綁定模式**
在上面的序列模式中使用 `_*` 匹配的內容好像被丟棄了,使用變量綁定可以找回來。如果整個模式匹配成功,符合部分模式的部分可以用變量代替。
格式:`變量名 @ 部分模式`
```scala
val expr = List(1, 2, 3)
expr match {
case List(x, tail@_*) => println(x, tail) // (1,List(2, 3))
case _ => println("not found")
}
```
- Scala是什么?
- Scala特性
- 開發環境搭建
- 環境搭建
- windows下的環境搭建
- IntelliJ IDEA環境搭建
- Scala關鍵字
- Hello, World
- 數據類型
- 數據類型
- 數據類型層次結構
- 字面量
- Null類型
- Nothing類型
- Unit類型
- 變量與常量
- type定義類型別名
- 字符串插值器
- 條件控制
- 循環控制
- 數組
- 元組
- 集合
- 集合分類
- List常用操作
- Set常用操作
- Map常用操作
- 函數
- 函數聲明與調用
- 函數與方法的區別
- 函數注意事項
- 匿名函數
- 可變參數
- 高階函數
- 中置表達式
- 函數嵌套
- 函數科里化
- 隱式參數
- 隱式函數
- 閉包
- 類和對象
- Java與Scala的比較
- 有關類與對象概念
- 類
- 類的定義和調用
- 類的繼承
- 抽象類
- 單例對象
- 伴生對象和伴生類
- 特質
- 定義特質
- 混入特質
- 抽象類與特質的選擇
- 自身類型
- 依賴注入
- this別名
- 樣例類
- 枚舉類
- 泛型類
- 包與包對象
- 模式匹配
- 基本語法
- 匹配模式
- 偏函數
- 注解
- 運算符
- 正則表達式
- 隱式類
- 異常處理
- 高級類型
- 結構類型
- 復合類型