Scala Tutorial - Learn How To Create Higher Order Function - Callback Function Parameter
Overview
In this tutorial, we will learn how to create Higher Order Function which is a function that takes another function as its parameter.
This tutorial is a continuation of the previous Higher Order Function tutorial and we will showcase how to define a function which has a callback or Option callback parameter.
Steps
1. How to define a function with a callback parameter
Let's say that you have a function named printReport() which needs to be passed in a function for sending email once the report is completed.
You can define the printReport() function to have a call-by-name parameter of type unit that will essentially be the email callback function.
println("Step 1: How to define a function with a callback parameter")
def printReport(sendEmailCallback: () => Unit) {
println("Printing report ... started")
// look up some data in database and create a report
println("Printing report ... finished")
sendEmailCallback()
}
2. How to call a function which has a callback parameter
When calling the printReport() function from Step 1, you will need to pass in a callback function for sending email.
println("\nStep 2: How to call a function which has a callback parameter")
printReport(() =>
println("Sending email ... finished")
)
You should see the following output when you run your Scala application in IntelliJ:
Step 2: How to call a function which has a callback parameter
Printing report ... started
Printing report ... finished
Sending email ... finished
3. How to call a function without providing its callback parameter
What if you wanted to print the report but not send any email?
println("\nStep 3: How to call a function without providing its callback parameter")
// printReport() // You get compile time error
NOTE:
- Calling printReport() function without passing a callback function will give you a compile time error.
You can instead pass in an empty anonymous function as shown below, although the syntax does not look that elegant:
printReport(() => {}) // Not that elegant.
4. How to define a function with an Option callback
Let's make use of what you've learned from the Option Tutorial and define another printReport() function which would have an Option callback parameter.
println("\nStep 4: How to define a function Function with an Option callback")
def printReportWithOptionCallback(sendEmailCallback: Option[() => Unit] = None) {
println("Printing report ... started")
// look up some data in database and create a report
println("Printing report ... finished")
sendEmailCallback.map(callback => callback())
}
NOTE:
- We are using the map() function to filter out any None callback function.
5. How to call a function without providing its callback parameter
With the printReportWithOptionCallback() function from Step 4 above, you can now more elegantly call the print report function without having to specify any callback function.
println("\nStep 5: How to call a function without providing its callback parameter")
printReportWithOptionCallback() // more elegant
You should see the following output when you run your Scala application in IntelliJ:
Step 5: How to call a function without providing its callback parameter
Printing report ... started
Printing report ... finished
6. How to call a function with Option callback parameter
If you've followed the tutorial on Option, the syntax for calling a function with an Option parameter should be familiar to you.
With regards to the callback function parameter, you now need to wrap it within Some()
println("\nStep 6: How to call a function with Option callback parameter")
printReportWithOptionCallback(Some(() =>
println("Sending email wrapped in Some() ... finished")
))
You should see the following output when you run your Scala application in IntelliJ:
Step 6: How to call a function with Option callback parameter
Printing report ... started
Printing report ... finished
Sending email wrapped in Some() ... finished
Summary
In this tutorial, we went over the following:
- How to define a function with a callback parameter
- How to call a function which has a callback parameter
- How to call a function without providing its callback parameter
- How to define a function with an Option callback parameter
- How to call a function without providing its callback parameter
- How to call a function with Option callback parameter
Tip
- You can learn more about call-by-name function parameters from the Scala specification.
Source Code
The source code is available on the allaboutscala GitHub repository.
What's Next
In the next tutorial, I will show you how to define function which can be stored as values.