Partial Functions in Scala

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:

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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))
    }
}

chevron_right


Output:



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:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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))
        }
    }

    chevron_right

    
    

    Output:

    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:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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))
        }
    }

    chevron_right

    
    

    Output:

    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:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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)
        }
    }

    chevron_right

    
    

    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.

  • 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:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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))
        }
    }

    chevron_right

    
    

    Output:

    280
    

    Here, andThen will append the output of Partial function with the another function given and then will return that value.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.