Scala---五种常见的模式匹配

本文深入探讨Scala中的模式匹配,包括常量模式、变量模式、通配符模式、构造器模式和类型模式。通过示例展示了如何在不同场景下使用这些模式,特别强调了构造器模式在处理复杂数据结构如二叉树时的强大功能。同时,解释了变量绑定模式如何允许在匹配过程中捕获和使用值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Scala 五种常见的模式匹配

1. 常量模式

常量模式包含常量变量和常量字面量

object PatternMatch {
  // 字面常量
  val BYTEDANCE = "bytedance.com"

  def foo(s: String): Unit = {
    s match {
      case BYTEDANCE => println("ok")
      case _ => println("can not match")
    }
  }

  def main(args: Array[String]): Unit = {
    // 常量变量
    val site = "bytedance.com"
    site match {
      case "bytedance.com" => println("ok")
      case _ => println("can not match")
    }

    foo("bytedance.com")
  }
}

常量模式由于需要匹配固定的字符串或其他类型的值,所以跟 if 判断没有什么区别。

2. 变量模式

变量模式没有什么意义,就是把一个变量传给另一个新的变量。

site match {whateverName => println(whateverName)}

这里只是把 site 的值传给了 whateverName 变量,没什么意义。但是变量模式有个约定,在 match 里的变量必须要小写字母开头,否则会被系统当成常量,系统回去尝试寻找该常量,如果没找到,就会报错。

3. 通配符模式

通配符使用下划线表示:"_",可以理解成一个占位符,如果学过 go 语言这里就很好理解。

通配符实际没什么用,表示该位置的值可以忽略。

在模式匹配中,通常会在最后一行加上 case _ => do something,相对于其他常见语言就相当于 default: do something,表示这里任何类型或任何值都可以,是一个兜底方案。

List(1, 2, 3) match {
  case List(_, 2, _) => println("ok")
  case _ => println("can not match")
}

在第一个 case 中的通配符表示,要匹配一个含有三个元素的 list,且第二个元素的值是 2,其他两个元素的值不关注,什么都行。

4. 构造器模式

构造器模式才是真正能体现出模式匹配威力的地方

首先,先构造出一个二叉树

trait Node
case class TreeNode(value: String, left: Node, right: Node) extends Node
case class Tree(root: TreeNode)

然后构造一个根节点有左右叶子节点的二叉树

val tree = Tree(TreeNode("root", TreeNode("left", null, null), TreeNode("right", null, null)))

这个时候,如果想要匹配,一个根,左子树的值是"left",右子树的值是"right"且右子树没有子节点

tree.root match {
  case TreeNode(_, TreeNode("left", _, _), TreeNode("right", null, null)) => println("ok")
  case _ => println("can not match")
}

5. 类型模式

类型模式就是判断该对象是否是某种类型。

"hello" match {_: String => println("hello")}

需要注意的是,如果使用了泛型,只能检测最外层的类型。

  def foo(s: Any): Unit = {
    s match {
      case a: List[String] => println("ok")
      case _ => println("can not match")
    }
  }

foo(List(1, 2, 3))
foo(List("A", "B", "C"))

这里两个 List 都可以匹配到,所以直接换成

case a: List[_] => do something

6. 变量绑定模式

上面二叉树的例子,如果你不仅希望可以匹配到符合要求的二叉树,还可以获取左子树的时候,你可以试试这样

tree.root match {
  case TreeNode(_, leftNode@TreeNode("left", _, _), TreeNode("right", null, null)) => println(leftNode.value)
  case _ => println("can not match")
}

可以在左子树前面加个变量名+ @,在后面就可以使用该变量了。

叮~🔔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值