Partial Functions in Scala

29 Mar, 2019
Introduction:When a function is not able to produce a return for every single variable input data given to it then that function is termed as Partial function. It can determine an output for a subset of some practicable inputs only. It can only be applied partially to the stated inputs.Some important points:
Partial functions are beneficent in understanding many inconsistent kind of Scala functions.
It can be interpreted by utilizing case statements.
It is a Trait, which needs two methods namely isDefinedAt and apply to be implemented.
Example:
// Scala program of // Partial function  // Creating object object Case{      // Main method    def main(args: Array[String])    {          // Creating Partial function         // using two methods        val r = new PartialFunction[Int, Int]         {              // Applying isDefinedAt method             def isDefinedAt(q: Int) = q != 0              // Applying apply method            def apply(q: Int) = 12 * q          }           // Displays output if the        // condition is satisfied        println(r(10))    }}
120

Here, two methods are defined for applying Partial function, where isDefinedAt states the condition and apply performs the operation if the given condition is satisfied.Methods to define Partial functions:There are some methods to define Partial function, which includes case statements, collect method, andThen, and orElse.
Partial function using Case statement:we will create a Partial function below using case statement.Example:// Scala program using// case statements  // Creating object object Case{      // Main method    def main(args: Array[String])    {          // Creating Partial function        val d: PartialFunction[Int, Int] =        {              // using case statement             case x if (x % 3) == 0 => x * 3        }          // Displays output if         // the condition is         // satisfied        println(d(3))    }}Output:9
Here, Partial function is created using case statement so, apply and isDefinedAt is not required here.
// Scala program using// case statements  // Creating object object Case{      // Main method    def main(args: Array[String])    {          // Creating Partial function        val d: PartialFunction[Int, Int] =        {              // using case statement             case x if (x % 3) == 0 => x * 3        }          // Displays output if         // the condition is         // satisfied        println(d(3))    }}
9

Here, Partial function is created using case statement so, apply and isDefinedAt is not required here.
Partial function using orElse:This method is helpful in chaining Partial functions together.Example:// Scala program using// orElse  // Creating object object orElse{      // Main method    def main(args: Array[String])    {          // Creating Partial function1        val M: PartialFunction[Int, Int] =         {              // using case statement             case x if (x % 5) == 0 => x * 5        }          // Creating Partial function2         val m: PartialFunction[Int, Int] =         {              // using case statement             case y if (y % 2) == 0 => y * 2        }          // chaining two partial         // functions using orElse         val r = M orElse m          // Displays output for         // which the given condition         // is satisfied        println(r(5))        println(r(4))    }}Output:25
8
Here, orElse will return output for which the given condition is satisfied.
// Scala program using// orElse  // Creating object object orElse{      // Main method    def main(args: Array[String])    {          // Creating Partial function1        val M: PartialFunction[Int, Int] =         {              // using case statement             case x if (x % 5) == 0 => x * 5        }          // Creating Partial function2         val m: PartialFunction[Int, Int] =         {              // using case statement             case y if (y % 2) == 0 => y * 2        }          // chaining two partial         // functions using orElse         val r = M orElse m          // Displays output for         // which the given condition         // is satisfied        println(r(5))        println(r(4))    }}
25
8

Here, orElse will return output for which the given condition is satisfied.
Partial function using Collect method:Collect method requests Partial function to every single element of the collection and thus, helps in constructing a new collection.Example:// Scala program using// collect method  // Creating object object Collect{      // Main method    def main(args: Array[String])    {          // Creating Partial function        val M: PartialFunction[Int, Int] =         {              // using case statement             case x if (x % 5) != 0 => x * 5        }          // Applying collect method        val y = List(7, 15, 9) collect { M }          // Displays output for which         // the given condition         // is satisfied        println(y)    }}Output:List(35, 45)
Here, Collect will apply Partial function to all the elements of the List and will return a new List on the basis of the conditions stated.
// Scala program using// collect method  // Creating object object Collect{      // Main method    def main(args: Array[String])    {          // Creating Partial function        val M: PartialFunction[Int, Int] =         {              // using case statement             case x if (x % 5) != 0 => x * 5        }          // Applying collect method        val y = List(7, 15, 9) collect { M }          // Displays output for which         // the given condition         // is satisfied        println(y)    }}
List(35, 45)

Here, Collect will apply Partial function to all the elements of the List and will return a new List on the basis of the conditions stated.
Partial function using andThen:This method appends at the end of the chains, which is utilized to continue towards additional chains of Partial functions.Example:// Scala program using// andThen method  // Creating object object andThen{      // Main method    def main(args: Array[String])    {          // Creating Partial function        val M: PartialFunction[Int, Int] =        {              // using case statement             case x if (x % 4) != 0 => x * 4        }          // Creating another function        val append = (x: Int) => x * 10          // Applying andThen method         val y = M andThen append          // Displays output after         // appending the another        // function given        println(y(7))    }}Output:280
Here, andThen will append the output of Partial function with the another function given and then will return that value.
// Scala program using// andThen method  // Creating object object andThen{      // Main method    def main(args: Array[String])    {          // Creating Partial function        val M: PartialFunction[Int, Int] =        {              // using case statement             case x if (x % 4) != 0 => x * 4        }          // Creating another function        val append = (x: Int) => x * 10          // Applying andThen method         val y = M andThen append          // Displays output after         // appending the another        // function given        println(y(7))    }}
280

Here, andThen will append the output of Partial function with the another function given and then will return that value.
Scala
Scala-Method
Scala
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.