scalatutorial.de

Stufe 2Sprachkern · Lektion 7 von 34

Elementare Kontrollstrukturen

Aktualisiert am 24. September 20263 Min. LesezeitSchritt 2/7 dieser Stufe

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:

Java-StilScala 3
var anrede = ""
if (weiblich) anrede = "Frau" else anrede = "Herr"

In Scala liefert if selbst einen Wert:

 Scala 3
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:

 Scala 3
if temperatur > 30 then println("Hitzewarnung")

Blöcke sind Ausdrücke

Ein Block aus mehreren Zeilen hat den Wert seiner letzten Zeile:

 Scala 3
val rabatt =
  val basis = if stammkunde then 0.05 else 0.0
  val menge = if stueck >= 10 then 0.03 else 0.0
  basis + menge

Deshalb 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:

 Scala 3
var i = 10
while i > 0 do
  println(i)
  i -= 2

Eine 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:

 Scala 3
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:

 Scala 3
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:

 Scala 3
val zahl =
  try "42x".toInt
  catch case _: NumberFormatException => 0

Mehr dazu in der Lektion über Exception Handling – und besser noch: in der über Try, die Fehler als Werte behandelt.

Was es nicht gibt

Passt dazu