Scala之模式匹配的理解和应用

Scala 提供了强大的模式匹配机制,应用也非常广泛。一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。

  • 通配模式、变量匹配和守卫

通配符 “_” 可以用来匹配任意对象。通常在模式匹配中作为最后一个匹配项,匹配其它所有的输入对象。

  //变量常量匹配;守卫
  def varCase(input: String): Unit = {
    input match {
      case "+" => println("+")
      case "-" => println("-")
      case ch if ch.length > 1 => println(ch) //给模式添加守卫,相当于一个判断条件
      case _ => println("_")
    }
  }
  • 类型匹配

可以根据表达式的类型进行匹配,在Scala中,我们更倾向于使用这种的模式匹配,而不是使用isInstanceOf操作符.

//类型匹配
def typeCase(input: Any): Unit = {
    input match {
      case s: String => println("This is a String var: " + input)
      case int: Int => println("This is a Int var: " + input)
      case _ => println("This is not Int and String var: " + input)
    }
  }
  • 匹配数组、列表和元组

  //匹配数组,列表和元组
  def arrayCase(arr: Array[String]): Unit = {
    arr match {
      case Array("Hello") => println("Array: Hello")
      case Array(x, y) => println("length: " + arr.length)
      case _ => println("_")
    }
  }
  //匹配列表
  def listMatch(list: List[String]): Unit = {
    list match {
      case "Hello" :: Nil => println("This list only contain hello.")
      case "Hello" :: "Scala" :: Nil => println("Hello Scala.")
      case x :: y :: Nil => println("x::y")
      case _ => println("default list.")
    }
  }
  //匹配元组
  def pairMatch(input: Any): Unit = {
    input match {
      case ("Hello", _) => println("Hello")
      case (x, "Hello", "Scala") => println(x + " Hello scala")
      case _ => println("default value")
    }
  }
  • 提取器

前面我们看到模式是如何匹配数组,列表和元组的,这些功能背后是提取器机制,带有从对象中提取值的unapply或unapplySeq方法的对象.unapply方法用于提取固定数量的对象,而unapplySeq提取的是一个序列.

arr match {
  case Array(0, x) => ...
  ...
}

Array伴生对象就是一个提取器,定义了一个unapplySeq方法.该方法被调用时,以被执行匹配动作的表达式作为参数.Array.unapplySeq(arr)产出一个序列的值,即数组中的值.第一个值与零进行比较,二第二个值被赋值给x.

 

请关注作者公众号:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值