案例1

  1. class A(val age: Int, val name: String)
  2. object People {
  3. def unapply(pp: A): Option[(Int, String)] =
  4. if (pp != null)
  5. Some(pp.age, pp.name)
  6. else None
  7. }
  8. object ObjMatch {
  9. def main(args: Array[String]): Unit = {
  10. val p = new A(10, "zhiling")
  11. p match {
  12. case People(age, name) => println(age, name)
  13. case _ => println("没匹配到. ")
  14. }
  15. }
  16. }

运行输出

(10,zhiling)

如果给main方法修改一下,下面这样也能匹配到

    val p = new A(10, "zhiling")
    p match {
      case People(10, "zhiling") => println("匹配到了. ")
      case _ => println("没匹配到. ")
    }

案例2

object Sqrt{

    def unapply(d: Double) =
        if(d >= 0) Some(math.sqrt(d))
        else None
}
object ObjMath1 {
    def main(args: Array[String]): Unit = {
        // 使用对象匹配的方式把一个数的平方根匹配出来

        val d: Double = 9

        d match {
            case Sqrt(a) => println(a)
        }
    }
}

执行main方法输出:

3.0

匹配序列

object MyArray {
  def unapplySeq(s: String): Option[List[String]] =

    if (s != null)
      Some(s.split(",").toList)
    else None
}

object ObMath2 {
  def main(args: Array[String]): Unit = {
    val names = "lisi,zhangsan,wangwu,zhiling,fengjie"

    names match {
      case MyArray(a, b, rest@_*) =>
        println(a) //输出: lisi
        println(b) //输出:  zhangsan
        println(rest) //输出: List(wangwu, zhiling, fengjie)
    }
  }
}