5. Scala中的match、模式匹配、样例类

1. match

Scala中的match表达式可以让你用任意的模式来选择,缺省的样例以下划线(_) 来表示。样例可以是任何常量、字符串等,每个可选项的最后不需要加上break(Scala中break是隐含的,不会出现某个可选项执行完继续执行下一个可选项的情况)。match表达式可以返回值。

2. 模式匹配

模式匹配应用场合:switch语句、类型查询、以及析构(获取复杂表达式中的不同部分)。

2.1 守卫

守卫可以是任何Boolean条件。

val ch = ""
val sign = ch match {
  case "+" => 1
  case "-" => -1
  case _ if ch.isEmpty() => 0
  case _ => -999
}
println(sign)  // 0
2.2 模式匹配常量、类型、数组/列表/元组
// 匹配常量:如果常量是小写字母开头,加反引号
val a = 123
val b = 123
val res01 = a match {
  case Pi => "a is Pi"
  case `b` => b
  case _ => "unknown"
}
println(res01)  // 123
// 匹配类型
val obj: Any = "1232dfsd"
val res02 = obj match {
  case x: Int => "Int: " + x
  case x: String if (obj.toString.toCharArray.filter(x => Character.isDigit(x)).size == obj.toString.size) => "String: " + Integer.parseInt(x)
  case x: BigInt => "BigInt: " + Integer.MAX_VALUE
  case _ => 0
}
println(res02) // 0
// 匹配数组、列表和元组
def f(arr: Array[Any]): String = arr match {
  case Array(0) => "0"
  case Array(x, y) => x + " " + y
  case Array(0, _*) => "0 ..."
  case _ => "something else"
}
println(f(Array(0, "aa")))  // 0 aa
println(f(Array(0)))        // 0
println(f(Array("aa")))     // something else
println(f(Array(0, 3, 5)))  // 0 ...
2.3 提取器
3. 样例类

Scala提供样例类对模式匹配进行了优化。

发布了8 篇原创文章 · 获赞 0 · 访问量 113

猜你喜欢

转载自blog.csdn.net/qq_42994084/article/details/105327159
今日推荐