Stufe 2Sprachkern · Lektion 9 von 34
Strings
Scala verwendet die String-Klasse von Java, ergänzt sie aber um viele Methoden und um String-Interpolation. Damit lassen sich Texte zusammensetzen, formatieren und zerlegen, ohne zu Hilfsklassen greifen zu müssen.
Grundlagen
val vorname = "Grace"
val nachname = "Hopper"
val voll = vorname + " " + nachname // "Grace Hopper"
voll.length // 12
voll.toUpperCase // "GRACE HOPPER"
voll.charAt(0) // 'G'
voll(0) // 'G' – kürzerStrings sind unveränderlich: Jede Methode wie toUpperCase liefert einen neuen String, der ursprüngliche bleibt, wie er ist.
Vergleichen mit ==
Anders als in Java vergleicht == in Scala den Inhalt, nicht die Speicheradresse. Sie brauchen also kein equals:
val a = "scala"
val b = "SCALA".toLowerCase
a == b // true
a.equalsIgnoreCase("Scala") // true
a.compareTo("java") // positive Zahl: "scala" kommt alphabetisch nach "java"Die Prüfung auf Identität (dasselbe Objekt) gibt es auch, sie heißt eq und wird selten gebraucht.
String-Interpolation
Drei Interpolatoren sind eingebaut:
val name = "Ada"
val jahr = 1815
val pi = math.Pi
s"$name wurde $jahr geboren." // einfache Ersetzung
s"In fünf Jahren: ${jahr + 5}" // beliebiger Ausdruck in ${}
f"Pi ≈ $pi%.3f" // formatiert: "Pi ≈ 3,142" oder "3.142"
f"$name%-10s|" // linksbündig auf 10 Zeichen
raw"C:\neu\tabelle" // ohne Escape-Auswertung- s setzt Werte ein und ruft dafür
toStringauf. - f arbeitet wie
printfmit Formatangaben. Der Compiler prüft sogar, ob Typ und Format zusammenpassen:f"$name%d"ist ein Übersetzungsfehler. - raw lässt Backslashes unverändert – nützlich für Windows-Pfade und reguläre Ausdrücke.
Das Dezimaltrennzeichen bei f hängt von der Spracheinstellung der JVM ab. Wer ein festes Format braucht, nutzt "%.3f".formatLocal(java.util.Locale.ROOT, pi).
Mehrzeilige Strings
Drei Anführungszeichen umschließen einen String über mehrere Zeilen, in dem auch einfache Anführungszeichen und Backslashes nicht maskiert werden müssen:
val gedicht =
"""Stufe um Stufe
|steigt man hinauf,
|nicht alle auf einmal.""".stripMarginstripMargin entfernt alle Zeichen bis einschließlich des senkrechten Strichs am Zeilenanfang. So kann der Text im Code sauber eingerückt sein, ohne dass die Einrückung im Ergebnis landet. Interpolation funktioniert auch hier: s"""…""".
Nützliche Methoden
| Methode | Ergebnis für " Scala ist schön " bzw. Beispiel |
|---|---|
trim / strip | "Scala ist schön" |
split(" ") | Array("Scala", "ist", "schön") (nach trim) |
contains("ist") | true |
startsWith("Sc") | true (nach trim) |
replace("schön", "knapp") | ersetzt alle Vorkommen |
take(5) / drop(6) | die ersten 5 Zeichen / alles ab Position 6 |
reverse | Zeichen in umgekehrter Reihenfolge |
toIntOption | "42".toIntOption ergibt Some(42), "x".toIntOption ergibt None |
isBlank | true, wenn nur Leerraum enthalten ist |
Viele dieser Methoden stammen aus Scalas Collections: Ein String verhält sich wie eine Folge von Char. Deshalb funktionieren auch map, filter, count und Co.:
"Mississippi".count(_ == 's') // 4
"Hallo Welt".filter(_.isUpper) // "HW"
"abc".map(_.toUpper) // "ABC"
"a,b,,c".split(",").filter(_.nonEmpty).toList // List(a, b, c)Sammlungen zu Text: mkString
Das Gegenstück zu split ist mkString:
val sprachen = List("Scala", "Kotlin", "Java")
sprachen.mkString(", ") // "Scala, Kotlin, Java"
sprachen.mkString("[", " | ", "]") // "[Scala | Kotlin | Java]"Viele Teile effizient zusammensetzen
Wer in einer Schleife tausende Teile anhängt, sollte nicht + verwenden, weil dabei jedes Mal ein neuer String entsteht. Besser ist ein StringBuilder:
val sb = StringBuilder()
for i <- 1 to 5 do sb.append(i).append(';')
sb.toString // "1;2;3;4;5;"Oft geht es aber noch einfacher mit (1 to 5).mkString(";").
Reguläre Ausdrücke
Mit .r wird aus einem String ein regulärer Ausdruck, den Sie direkt in Pattern Matching einsetzen können:
val Datum = raw"(\d{4})-(\d{2})-(\d{2})".r
"2026-09-24" match
case Datum(j, m, t) => s"$t.$m.$j"
case _ => "kein Datum"
// "24.09.2026"