Scala Methods vs Functions
This chapter takes you through the differences between methods and functions in Scala programming. Both methods and functions are fundamental in Scala. But these have distinct characteristics and usages.
Introduction to Methods and Functions
Both methods and functions in Scala are reusable blocks of code. These perform specific tasks. However, both of these have some differences.
Methods
Methods in Scala are defined inside classes, traits, and objects. You can define a method using the def keyword in Scala. Methods can take parameters and return values. Methods encapsulate logic to be executed when called. These are invoked using the dot notation on objects or instances.
Functions
Functions in Scala are first-class citizens. It can be assigned to variables, passed as arguments, and returned from other functions. These are defined using function literals (also known as lambda expressions) and can be treated as values. You can define a function using the def keyword and the => symbol for anonymous function.
Differences between Methods and Functions
Methods
You can define a method using the def keyword, followed by the method name, parameter list, return type, and method body.
The syntax of the method is -
def methodName(param1: Type1, param2: Type2): ReturnType = {
// Method body
// return some value of ReturnType
}
Functions
You can define a function using the => syntax (function literal). It can be assigned to variables.
The syntax of the function is -
val functionName = (param1: Type1, param2: Type2) => {
// Function body
// return some value
}
Example
The following examples shows the differences between methods and functions in Scala programming -
Method Example
object Demo {
def add(a: Int, b: Int): Int = {
a + b
}
def main(args: Array[String]): Unit = {
val sum = add(5, 3)
println(s"The sum is: $sum")
}
}
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
The sum is: 8
In the example, the add method takes two parameters of type Int. This method returns their sum. The Demo object calls the add method and prints the result.
Function Example
object Demo {
def main(args: Array[String]): Unit = {
val add = (a: Int, b: Int) => a + b
val sum = add(5, 3)
println(s"The sum is: $sum")
}
}
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
The sum is: 8
In the example, an anonymous function is assigned to the add variable. The Demo object calls the anonymous function and prints the result.
Invoking Methods vs. Functions
Invoking Methods
Methods are invoked on instances of classes, traits, and objects using dot notation.
Example
val calc = new Calculator() val result = calc.add(5, 3)
Invoking Functions
Functions are invoked by calling the function variable with the required parameters.
Example
val add = (x: Int, y: Int) => x + y val result = add(5, 3)
Passing Functions as Parameters
You can pass functions as parameters to other functions and methods. So, there can be higher-order functions.
Example
object Demo {
def applyFunction(f: (Int, Int) => Int, a: Int, b: Int): Int = {
f(a, b)
}
def main(args: Array[String]): Unit = {
val add = (a: Int, b: Int) => a + b
val sum = applyFunction(add, 5, 3)
println(s"The sum is: $sum")
}
}
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
The sum is: 8
In the example, the applyFunction method takes a function f as parameter with two integers a and b. The Demo object calls applyFunction with an anonymous function that adds two numbers.
Method-to-Function Conversion
You can convert a method into a function by using the underscore _ syntax.
Example
class Calculator {
def add(x: Int, y: Int): Int = {
x + y
}
}
object Demo {
def main(args: Array[String]): Unit = {
val calc = new Calculator()
val addFunction = calc.add _
val result = addFunction(5, 3)
println(s"The sum is: $result") // The sum is: 8
}
}
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
The sum is: 8
Difference Between Methods and Functions
The following table shows the differences between methods and functions in Scala −
| Feature | Methods | Functions |
|---|---|---|
| Definition | Defined using the def keyword inside classes, traits, and objects. | Defined using function literals (=> syntax) and can be assigned to variables. |
| Invocation | Invoked using dot notation on instances of classes, traits, and objects. | Invoked by calling the function variable with required parameters. |
| Scope | Associated with instances of classes, traits, and objects. | First-class citizens. These can exist independently and can be assigned to variables. |
| Return Type | Must explicitly specify return type. | Return type inferred unless explicitly specified. |
| Parameter Types | Parameter types must be explicitly declared. | Parameter types can be inferred or explicitly declared. |
| Usage | Used for defining behaviors and actions within classes and objects. | Used for functional programming paradigms, higher-order functions, and more concise code. |
| Conversion | Can be converted to functions using underscore (_) syntax. | N/A (Already functions by nature). |
| Higher-Order Functions | Can accept functions as parameters and return function. | Are functions and can be passed around as such. |
| Example |
class Calculator {
def add(x: Int, y: Int): Int = x + y
}
|
val add = (x: Int, y: Int) => x + y |
Methods vs Functions Summary
- Methods and functions are reusable blocks of code in Scala. But these have some differences.
- Methods are defined within a class, object, and trait using the def keyword and are invoked using dot
- Functions are first-class citizens. Functions can be assigned to variables, passed as arguments, and returned from other functions. These can be defined using the def keyword and the => symbol is used for anonymous functions.