In diesem Beitrag möchte ich dir gerne die Closures von Apache Groovy zeigen und was du mit diesem Sprachkonstrukt in deinem Code bewerkstelligen kannst.

Was sind Closures?
Eine Closure ist eine Hülle für ein Stück Code, ähnlich wie eine Funktion, jedoch hat diese keinen Namen und kann nur einer Variable zugeordnet werden.
Einer Closure kannst du Parameter übergeben und auch ein Ergebnis aus dieser erhalten, ganz wie mit einer Funktion, und auch der Aufruf ist sehr ähnlich, jedoch bist du mit diesem Konstrukt deutlich flexibler und kannst einzelne Funktionen während der Laufzeit austauschen (aber dazu später mehr).
Ein kleines Beispiel von Apache Groovy Closures
Hier zunächst ein kleines Beispiel mit der Erzeugung und dem Aufruf einer Closure in Apache Groovy.
Für alle nachfolgenden Beispiele verwende ich die GroovyConsole, diese ist für die gezeigten Beispiele ausreichend. Du kannst natürlich auch eine „richtige“ Entwicklungsumgebung wie die Eclipse IDE verwenden, wie du diese einrichtest, habe ich im Beitrag Einrichten von Eclipse zum Entwickeln in Apache Groovy ausführlich erläutert.
/** definieren einer Variable und zuweisen einer Closure innerhalb der geschweiften Klammer rufen wir hier nur die Funktion println auf und geben den Text Hello World! aus. **/ def var1 = {println("Hello World!")} /** Aufruf der Variable und ausführen des Codes innerhalb der Closure **/ var1()
Ausgabe in der GroovyConsole:
groovy> /**
groovy> definieren einer Variable und zuweisen einer Closure
groovy> innerhalb der geschweiften Klammer rufen wir
groovy> hier nur die Funktion println auf und geben den Text
groovy> Hello World! aus.
groovy> **/
groovy> def var1 = {println("Hello World!")}
groovy> /**
groovy> Aufruf der Variable und ausführen
groovy> des Codes innerhalb der Closure
groovy> **/
groovy> var1()
Hello World!
Du kannst alternativ auf die Closure mit der Funktion „call()“ aufrufen, das Ergebnis ist in diesem Fall dasselbe.
Parameter definieren
Wie bereits erwähnt verhält sich das Konstrukt wie eine Funktion und einer Funktion können wir beliebige (und auch beliebig viele) Parameter zuweisen. Wobei wir diesen Parametern default Werte zuweisen können und diese dann auch nicht übergeben müssen.
Im nachfolgenden möchte ich dir nun zeigen wie du eine Closure mit explizieten und implizieten Parametern schreibst und diese aufrufen kannst.
Eine Closure mit expliziten Parameter
Ein expliziter Parameter in einer Closure ist daran zu erkennen, dass dieser einen Namen trägt und am Anfang benannt wird.
Im nachfolgenden Beispiel übergebe ich den Vornamen (firstname) und den Nachnamen (lastname) um diesen dann zusammenzufügen und über die Funktion println auszugeben.
def var1 = {firstname, lastname -> println(firstname + " " + lastname)} var1.call("Stefan", "Draeger")
Ausgabe in der GroovyConsole:
groovy> def var1 = {firstname, lastname -> println(firstname + " " + lastname)}
groovy> var1.call("Stefan", "Draeger")
Stefan Draeger
Closure mit impliziten Parameter
Wenn du einer Closure keine Parameter übergibst, dann hast du trotzdem den impliziten Parameter „it“. Diesen kannst du wie folgt innerhalb deines Konstrukts verwenden:
def var1 = {println(it)} var1.call("Hallo Welt!")
Ausgabe in der GroovyConsole:
groovy> def var1 = {println(it)}
groovy> var1.call("Hallo Welt!")
Hallo Welt!
Default Werte an Parameter
Den Parametern kannst du auch Default Werte geben und somit festlegen, welchen Wert diese einnehmen sollen, wenn diese nicht übergeben werden.
def var1 = {firstname="Max", lastname="Mustermann" -> println(firstname + " " + lastname)} var1.call()
Ausgabe in der GroovyConsole:
groovy> def var1 = {firstname="Max", lastname="Mustermann" -> println(firstname + " " + lastname)}
groovy> var1.call()
Max Mustermann
Multimethoden mit Closures
Im ersten Beispiel haben wir ein einfaches „Hello World!“ mit der Funktion println ausgegeben, dieses können wir deutlich einfacher machen, indem wir vor der Funktion das & Zeichen setzen.
def var1 = System.out.&println var1("Hello World!")
Wir delegieren also einfach unseren übergebenen Wert an die Funktion println weiter.
Ausgabe in der GroovyConsole:
groovy> def var1 = System.out.&println
groovy> var1("Hello World!")
Hello World!
Quellenangaben
Für diesen Beitrag habe ich mich aus den offizielen, englischen Dokumenten zur Sprache Apache Groovy bedient, so von einer Wiki-Seite.
Besten Dank und schönes WE;)