Groovy - Verschlüsse
Ein Abschluss ist ein kurzer anonymer Codeblock. Es umfasst normalerweise nur ein paar Codezeilen. Eine Methode kann sogar den Codeblock als Parameter verwenden. Sie sind anonym.
Das Folgende ist ein Beispiel für einen einfachen Verschluss und wie er aussieht.
class Example {
static void main(String[] args) {
def clos = {println "Hello World"};
clos.call();
}
}
Im obigen Beispiel wird die Codezeile - {println "Hello World"} als Abschluss bezeichnet. Der Codeblock, auf den dieser Bezeichner verweist, kann mit der call-Anweisung ausgeführt werden.
Wenn wir das obige Programm ausführen, erhalten wir das folgende Ergebnis:
Hello World
Formale Parameter in Verschlüssen
Verschlüsse können auch formale Parameter enthalten, um sie nützlicher zu machen, genau wie Methoden in Groovy.
class Example {
static void main(String[] args) {
def clos = {param->println "Hello ${param}"};
clos.call("World");
}
}
Beachten Sie im obigen Codebeispiel die Verwendung von $ {param}, wodurch der Abschluss einen Parameter annimmt. Wenn wir den Abschluss über die Anweisung close.call aufrufen, haben wir jetzt die Möglichkeit, einen Parameter an den Abschluss zu übergeben.
Wenn wir das obige Programm ausführen, erhalten wir das folgende Ergebnis:
Hello World
Die nächste Abbildung wiederholt das vorherige Beispiel und führt zum gleichen Ergebnis, zeigt jedoch, dass ein impliziter einzelner Parameter, auf den Bezug genommen wird, verwendet werden kann. Hier ist 'es' ein Schlüsselwort in Groovy.
class Example {
static void main(String[] args) {
def clos = {println "Hello ${it}"};
clos.call("World");
}
}
Wenn wir das obige Programm ausführen, erhalten wir das folgende Ergebnis:
Hello World
Verschlüsse und Variablen
Formal können sich Schließungen auf Variablen zum Zeitpunkt der Definition der Schließung beziehen. Das Folgende ist ein Beispiel dafür, wie dies erreicht werden kann.
class Example {
static void main(String[] args) {
def str1 = "Hello";
def clos = {param -> println "${str1} ${param}"}
clos.call("World");
// We are now changing the value of the String str1 which is referenced in the closure
str1 = "Welcome";
clos.call("World");
}
}
Im obigen Beispiel definieren wir nicht nur einen Parameter an den Abschluss, sondern definieren auch eine Variable namens str1. Der Abschluss übernimmt neben dem Parameter auch die Variable.
Wenn wir das obige Programm ausführen, erhalten wir das folgende Ergebnis:
Hello World
Welcome World
Verwenden von Verschlüssen in Methoden
Verschlüsse können auch als Parameter für Methoden verwendet werden. In Groovy haben viele der integrierten Methoden für Datentypen wie Listen und Sammlungen Abschlüsse als Parametertyp.
Das folgende Beispiel zeigt, wie ein Abschluss als Parameter an eine Methode gesendet werden kann.
class Example {
def static Display(clo) {
// This time the $param parameter gets replaced by the string "Inner"
clo.call("Inner");
}
static void main(String[] args) {
def str1 = "Hello";
def clos = { param -> println "${str1} ${param}" }
clos.call("World");
// We are now changing the value of the String str1 which is referenced in the closure
str1 = "Welcome";
clos.call("World");
// Passing our closure to a method
Example.Display(clos);
}
}
Im obigen Beispiel ist
Wir definieren eine statische Methode namens Display, die einen Abschluss als Argument verwendet.
Wir definieren dann einen Abschluss in unserer Hauptmethode und übergeben ihn als Parameter an unsere Anzeigemethode.
Wenn wir das obige Programm ausführen, erhalten wir das folgende Ergebnis:
Hello World
Welcome World
Welcome Inner
Schließungen in Sammlungen und Zeichenfolgen
Mehrere List-, Map- und String-Methoden akzeptieren einen Abschluss als Argument. Schauen wir uns ein Beispiel an, wie Verschlüsse in diesen Datentypen verwendet werden können.
Verschlüsse mit Listen verwenden
Das folgende Beispiel zeigt, wie Verschlüsse mit Listen verwendet werden können. Im folgenden Beispiel definieren wir zunächst eine einfache Liste von Werten. Der Listensammlungstyp definiert dann eine aufgerufene Funktion.each. Diese Funktion nimmt einen Abschluss als Parameter an und wendet den Abschluss auf jedes Element der Liste an.
class Example {
static void main(String[] args) {
def lst = [11, 12, 13, 14];
lst.each {println it}
}
}
Wenn wir das obige Programm ausführen, erhalten wir das folgende Ergebnis:
11
12
13
14
Verwenden von Verschlüssen mit Karten
Das folgende Beispiel zeigt, wie Abschlüsse mit Maps verwendet werden können. Im folgenden Beispiel definieren wir zunächst eine einfache Zuordnung von Schlüsselwertelementen. Der Kartensammlungstyp definiert dann eine Funktion namens .each. Diese Funktion nimmt einen Abschluss als Parameter an und wendet den Abschluss auf jedes Schlüssel-Wert-Paar der Karte an.
class Example {
static void main(String[] args) {
def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"]
mp.each {println it}
mp.each {println "${it.key} maps to: ${it.value}"}
}
}
Wenn wir das obige Programm ausführen, erhalten wir das folgende Ergebnis:
TopicName = Maps
TopicDescription = Methods in Maps
TopicName maps to: Maps
TopicDescription maps to: Methods in Maps
Oft möchten wir möglicherweise über die Mitglieder einer Sammlung iterieren und eine Logik nur anwenden, wenn das Element ein bestimmtes Kriterium erfüllt. Dies wird leicht mit einer bedingten Aussage im Abschluss behandelt.
class Example {
static void main(String[] args) {
def lst = [1,2,3,4];
lst.each {println it}
println("The list will only display those numbers which are divisible by 2")
lst.each{num -> if(num % 2 == 0) println num}
}
}
Das obige Beispiel zeigt den bedingten Ausdruck if (num% 2 == 0), der im Abschluss verwendet wird, um zu überprüfen, ob jedes Element in der Liste durch 2 teilbar ist.
Wenn wir das obige Programm ausführen, erhalten wir das folgende Ergebnis:
1
2
3
4
The list will only display those numbers which are divisible by 2.
2
4
Mit Verschlüssen verwendete Methoden
Die Verschlüsse selbst bieten einige Methoden.
Sr.Nr. | Methoden & Beschreibung |
---|---|
1 | finden()
Die find-Methode findet den ersten Wert in einer Sammlung, der einem bestimmten Kriterium entspricht. |
2 | finde alle()
Es werden alle Werte im empfangenden Objekt gefunden, die der Schließbedingung entsprechen. |
3 | any () & every ()
Die Methode any durchläuft jedes Element einer Sammlung und prüft, ob ein boolesches Prädikat für mindestens ein Element gültig ist. |
4 | sammeln()
Die Methode collect durchläuft eine Sammlung und konvertiert jedes Element in einen neuen Wert, wobei der Verschluss als Transformator verwendet wird. |