Chapter 5
[ 101 ]
Passing multiple parameters
So far, our examples have all been using single parameters. To accept multiple
parameters, we will list the parameters in order before the -> symbol:
given: "a closure which declares no params"
def greet = { greeting, name -> println "$greeting, $name" }
when: "we invoke the closure"
greet "Hello", "Dolly"
then:
"Hello, Dolly" == output()
Default parameter values
We can define default parameters by supplying a value in the parameter list,
as follows:
given: "a closure with default parameters"
def greetString = {greeting, name = "World" ->
return "${greeting}, ${name}!"
}
expect:
greetString("Hello") == "Hello, World!"
greetString("Hello", "Dolly") == "Hello, Dolly!"
Implementing closures in Java
Earlier we looked at the Closure code generated for us by the Groovy compiler.
We know that under the covers a closure is just a Java class extending the
groovy.lang.Closure interface. So, let's try implementing a closure in pure Java:
public class StringClosure extends Closure{
public StringClosure(Object owner) {
super(owner);
}
public StringClosure(Object owner, Object thisObject) {
super(owner, thisObject);
}
Object doCall(String message) {
System.out.println(message);
return null;
}
}