EMZETT.
Login

Kurz: In Groovy ist vieles „wahr“ oder „falsch“: leere Strings, leere Listen, null und 0 gelten als falsch:

Teil des Kurses Groovy

Kapitel 2 von 8 im Kurs Groovy. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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; return ist optional
  • Groovy-Wahrheit: null, 0, leere Strings/Collections sind falsch
  • ?: (Elvis) und ?. (sicherer Zugriff) vermeiden null-Fehler
  • Closures { x -> ... } sind Werte: curry, >>, it und Übergabe als letztes Argument

Übungsaufgabe

Schreibe eine Methode fib(n) und gib die ersten 10 Fibonacci-Zahlen mit each aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Einführung und erstes Programm

Weiter: Collections: Listen, Maps und Ranges

Alle Kapitel: Groovy im Überblick