Scala - Pattern Matching
Scala has a concept of a match expression which provides great support for pattern matching, in processing the messages. In the most simple case it can be used like a Java match statement. The syntax for using match expression is given below:
Syntax
expression match { case 1 => statement 1 case 2 => statement 2 ... ... ... case N => statement N // default case case _ => default statement }
The expression is evaluated and matched with the cases. When the case matches, the following block of code is executed. If no case matches with expression, the default code block gets executed.
Example:
In the example below, a variable called i with value 2 is matched against case values. When the case value matches with expression value, the following block of code gets executed.
object MainObject { def main(args: Array[String]) { var i = 2 i match { case 1 => println("Red") case 2 => println("Blue") case 3 => println("Green") case _ => println("No match found") } } }
The output of the above code will be:
Blue
Common code blocks
There are instances where same code block is required in multiple cases.
Example:
In the example below, same code block is shared for different match cases.
object MainObject { def main(args: Array[String]) { var i = 10 i match { case 1 => println("Red") case 2 | 10 => println("Blue") case 3 | 4 | 5 => println("Green") case _ => println("No match found") } } }
The output of the above code will be:
Blue
Using if expressions in case statements
Scala gives the flexibility of using if expressions in case statements which can be used for pattern matching.
Example:
In the example below, the second, third and fourth case statements, all use if expressions to match ranges of numbers.
object MainObject { def main(args: Array[String]) { var i = 50 i match { case 1 => println("Red") case i if i == 2 || i == 10 => println("Blue") case i if 3 to 5 contains i => println("Green") case i if i > 10 => println("Yellow") case _ => println("No match found") } } }
The output of the above code will be:
Yellow
Using Any type
Scala gives the flexibility of using Any type with the case statements which provides great support for pattern matching.
Example:
In the example below, any type of argument is used at the same time with the match expression.
object MainObject { def matchTest(i: Any): Any = i match { case 1 => "Red" case i if i == 2 || i == 10 => "Blue" case i if 3 to 5 contains i => "Green" case "Y" => 1 case "N" => 0 case "LON" => "London" case "MUM" => "Mumbai" case _ => "No match found" } def main(args: Array[String]) { println("matchTest(20) = " + matchTest(20)) println("matchTest(10) = " + matchTest(10)) println("matchTest(\"Y\") = " + matchTest("Y")) println("matchTest(\"LON\") = " + matchTest("LON")) } }
The output of the above code will be:
matchTest(20) = No match found matchTest(10) = Blue matchTest("Y") = 1 matchTest("LON") = London
Using case Classes
The case classes are special classes that are used in pattern matching with case expressions. These can be considered as standard classes with a special modifier: case.
Example:
Consider the example below where case class is used for pattern matching.
object MainObject { //case class case class Person(name: String, age: Int) //match function def matchPerson(p: Person) = p match { case Person("John", 25) => "Hi John" case Person("Marry", 27) => "Hi Marry" case Person(name, age) => "Data is not found for: " + name + ", " + age + " years old" } def main(args: Array[String]) { val p1 = new Person("John", 25) val p2 = new Person("Marry", 27) val p3 = new Person("Kim", 25) println(matchPerson(p1)) println(matchPerson(p2)) println(matchPerson(p3)) } }
The output of the above code will be:
Hi John Hi Marry Data is not found for: Kim, 25 years old