Stufe 2Sprachkern · Lektion 7 von 34
Elementare Kontrollstrukturen
Scala kennt die üblichen Kontrollstrukturen – if, while, for –, behandelt sie aber anders als Java: Fast alles ist ein Ausdruck und liefert einen Wert. Das spart Hilfsvariablen und macht Code kürzer.
if als Ausdruck
In Java schreibt man oft:
var anrede = ""
if (weiblich) anrede = "Frau" else anrede = "Herr"In Scala liefert if selbst einen Wert:
val anrede = if weiblich then "Frau" else "Herr"Das ersetzt nebenbei den Bedingungsoperator ?: aus Java und C, den es in Scala nicht gibt. Die Schreibweise mit then ist neu in Scala 3; die klassische Form if (weiblich) "Frau" else "Herr" funktioniert weiterhin.
Fehlt der else-Zweig, hat der Ausdruck den Typ Unit – er wird also nur wegen seiner Wirkung ausgeführt:
if temperatur > 30 then println("Hitzewarnung")Blöcke sind Ausdrücke
Ein Block aus mehreren Zeilen hat den Wert seiner letzten Zeile:
val rabatt =
val basis = if stammkunde then 0.05 else 0.0
val menge = if stueck >= 10 then 0.03 else 0.0
basis + mengeDeshalb braucht Scala auch selten return: Eine Methode gibt einfach den Wert ihres Rumpfs zurück.
while-Schleifen
Die while-Schleife funktioniert wie in anderen Sprachen und liefert Unit:
var i = 10
while i > 0 do
println(i)
i -= 2Eine do … while-Schleife gibt es in Scala 3 nicht mehr. Im Alltag werden Sie while selten brauchen: Die meisten Schleifen lassen sich mit for-Ausdrücken oder Collection-Methoden wie foreach, map und filter klarer schreiben.
for in Kurzform
Ausführlich behandelt die Lektion über for-Ausdrücke die Möglichkeiten. Hier nur die Grundform:
for i <- 1 to 5 do println(i * i) // 1, 4, 9, 16, 25
val quadrate = for i <- 1 to 5 yield i * i // Vector(1, 4, 9, 16, 25)1 to 5 erzeugt einen Bereich von 1 bis einschließlich 5, 1 until 5 einen bis ausschließlich 5. Mit do wird der Rumpf für jeden Wert ausgeführt, mit yield entsteht eine neue Sammlung.
match statt switch
Das switch aus Java heißt in Scala match und ist deutlich mächtiger:
def wochentag(n: Int): String = n match
case 1 | 2 | 3 | 4 | 5 => "Werktag"
case 6 | 7 => "Wochenende"
case _ => "ungültig"Es gibt kein Durchfallen in den nächsten Fall und kein break. Der Unterstrich _ fängt alles andere ab. Weil auch match ein Ausdruck ist, lässt sich das Ergebnis direkt zurückgeben. match kann weit mehr als Zahlen vergleichen – es zerlegt Datenstrukturen, prüft Typen und bindet Variablen. Das zeigt die Lektion über Pattern Matching.
Ausnahmen: try
Auch try ist ein Ausdruck:
val zahl =
try "42x".toInt
catch case _: NumberFormatException => 0Mehr dazu in der Lektion über Exception Handling – und besser noch: in der über Try, die Fehler als Werte behandelt.
Was es nicht gibt
- Kein
breakundcontinueals Schlüsselwort. Für den seltenen Fall gibt esscala.util.boundary, meist ist eine Collection-Methode wiefindodertakeWhiledie bessere Lösung. - Keinen Bedingungsoperator
?:–iferfüllt denselben Zweck. - Kein
i++, stattdesseni += 1.