Groovy Functional Programming - Higher Order Functions

Lets create a closure which adds two numbers.

def add = { number1, number2 ->
  number1 + number2
}

If you are not familiar with closures, this article has the necessary details.

Let's create a function which accepts this closure and invokes it by passing two numbers.

def perform(def operation) {
  def number1 = 10
  def number2 = 20
  def result = operation(number1, number2)
  println "Result is $result"
}
perform(add) // Result is 30

Note that I opted to express perform as a function. You are free to define a closure instead. Since perform acccepts another closure as an argument, it becomes a higher order function.

Similary we can create another closure multiply which can be passed as an argument to perform to multiply the numbers.

def multiply = { number1, number2 ->
  number1 * number2
}
perform(multiply) // Result is 200

Also we can define higher order functions that return closures.

def createOperation = { String symbol ->
    if (symbol == '+') {
        add
    } else if (symbol == '*') {
        multiply
    }
}

def addOperation = createOperation('+')
perform(addOperation) // Result is 30
def multiplyOperation = createOperation('*')
perform(multiplyOperation) // Result is 200

We could improve this code by moving the definitions of add and multiply closures into createOperation.

def createOperation = { String symbol ->
	 def add = { number1, number2 ->
  		number1 + number2
	 }
	 def multiply = { number1, number2 ->
  		number1 * number2
	 }
    if (symbol == '+') {
        add
    } else if (symbol == '*') {
        multiply
    }
}

You may want to take a look at slides from my FunctionalConf talk for more examples.

Show Comments