Groovy for Domain-specific Languages - Second Edition

(nextflipdebug2) #1
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;
}
}
Free download pdf