Bedingungen und Groovy-Wahrheit
In Groovy ist vieles „wahr“ oder „falsch“: leere Strings, leere Listen, null und 0 gelten als falsch:
def n = 15
if (n % 15 == 0) println "FizzBuzz"
else if (n % 3 == 0) println "Fizz"
else println n
def status = n > 10 ? "groß" : "klein"
println status
println(null ? "wahr" : "falsch")
println("" ? "wahr" : "falsch")
println([] ? "wahr" : "falsch")
println([0] ? "wahr" : "falsch")
println("x" ? "wahr" : "falsch")
def name = null
println name ?: "Standardname" // Elvis-Operator
println name?.length() // sicherer Zugriff
println "Text"?.toUpperCase()
switch (n) {
case 1..9: println "einstellig"; break
case [10, 15, 20]: println "in der Liste"; break
case ~/\d+/: println "Regex"; break
default: println "sonst"
}
switch ("hallo") {
case String: println "ein String"; break
}Ausgabe
FizzBuzz groß falsch falsch falsch wahr wahr Standardname null TEXT in der Liste ein String
Schleifen
for (int i = 1; i <= 5; i++) print "$i "
println()
for (x in [10, 20, 30]) print "$x "
println()
for (i in 1..5) print "$i "
println()
for (i in 5..1) print "$i "
println()
(1..<4).each { print "$it " }
println()
3.times { print "t$it " }
println()
1.step(10, 3) { print "$it " }
println()
10.downto(7) { print "$it " }
println()
def k = 0
while (k < 3) { print "w$k "; k++ }
println()
[1, 2, 3].eachWithIndex { w, i -> print "$i:$w " }
println()
outer:
for (a in 1..3) {
for (b in 1..3) {
if (a * b == 4) break outer
print "${a * b} "
}
}
println()Ausgabe
1 2 3 4 5 10 20 30 1 2 3 4 5 5 4 3 2 1 1 2 3 t0 t1 t2 1 4 7 10 9 8 7 w0 w1 w2 0:1 1:2 2:3 1 2 3 2
Methoden
def quadrat(x) { x * x } // letzter Ausdruck ist der Rückgabewert
int addiere(int a, int b) { return a + b }
String begruesse(String name, String gruss = "Hallo") { "$gruss, $name!" }
def summe(int... zahlen) { zahlen.sum() }
def minmax(liste) { [liste.min(), liste.max()] }
def person(Map args) { "${args.name} (${args.alter ?: 18})" }
println quadrat(7)
println addiere(3, 4)
println begruesse("Mia")
println begruesse("Tom", "Servus")
println summe(1, 2, 3, 4)
def (kleinster, groesster) = minmax([5, 3, 9, 1])
println "$kleinster $groesster"
println person(name: "Zoe", alter: 21)
println person(name: "Ben")Ausgabe
49 7 Hallo, Mia! Servus, Tom! 10 1 9 Zoe (21) Ben (18)
Closures
Closures sind anonyme Codeblöcke mit eigenem Gültigkeitsbereich – das Herz von Groovy:
def verdopple = { x -> x * 2 }
def addiere = { a, b -> a + b }
def gruss = { "Hallo, $it!" } // 'it' = einziger Parameter
def zaehler = { int n = 0; { -> ++n } }()
println verdopple(21)
println addiere(3, 4)
println gruss("Mia")
println zaehler() + zaehler() + zaehler()
def wende = { f, x -> f(f(x)) }
println wende(verdopple, 5)
def multiplikator = { faktor -> { x -> x * faktor } }
def dreifach = multiplikator(3)
println dreifach(7)
def plus5 = addiere.curry(5)
println plus5(10)
def komp = verdopple >> gruss
println komp(4)
def summiere = 0
[1, 2, 3].each { summiere += it }
println summiere
def ausfuehren(Closure c) { c() }
println ausfuehren { "Closure als letztes Argument" }Ausgabe
42 7 Hallo, Mia! 6 20 21 15 Hallo, 8! 6 Closure als letztes Argument
Merke
- Der letzte Ausdruck einer Methode ist ihr Rückgabewert;
returnist optional - Groovy-Wahrheit:
null,0, leere Strings/Collections sind falsch ?:(Elvis) und?.(sicherer Zugriff) vermeidennull-Fehler- Closures
{ x -> ... }sind Werte:curry,>>,itund Übergabe als letztes Argument
Aufgabe
Schreibe eine Methode fib(n) und gib die ersten 10 Fibonacci-Zahlen mit each aus.