logo

Scala - Pattern Matching

Last Updated: 2021-11-19
  • first match
  • no fall through
  • each case is followed by a function: case Pattern => Body
  • _ as default, always the last one
scala> val point = Array(x, y, z)
point: Array[Int] = Array(1, 2, 3)

scala> val Array(x, _*) = point
x: Int = 1

scala> val Array(x, xs @ _*) = point
x: Int = 1
xs: Seq[Int] = Vector(2, 3)
object MatchTest1  {
  def toString(x: Int): String = x match {
    case 1 => "one"
    case 2 => "two"
    case _ => "many"
  }

  def main(args: Array[String]) = {
    println(toString(1))
    println(toString(2))
    println(toString(3))
  }
}
$ scala test.scala
one
two
many

To use value from a val or var, use the backquote(`):

object MatchTest1  {
  def toString(x: Int): String = {
    val special = 100
    x match {
      case 1 => "one"
      case 2 => "two"
      case `special` => "something special"
      case _ => "many"
    }
  }

  def main(args: Array[String]) = {
    println(toString(1))
    println(toString(2))
    println(toString(100))
    println(toString(101))
  }
}

Run the code:

$ scala test.scala
one
two
something special
many
object MatchTest1  {
  def testType(x: Any): String = {
    x match {
      case y:Int => "is Int"
      case z:String => "is String"
    }
  }

  def main(args: Array[String]) = {
    println(testType("1"))
    println(testType(1))
    println(testType(1.0))
  }
}

Run the code:

$ scala test.scala
is String
is Int
scala.MatchError: 1.0 (of class java.lang.Double)
	at Main$.testType(test.scala:3)
	at Main$.main(test.scala:12)
	at Main.main(test.scala)