scalatutorial.de

Stufe 2Sprachkern · Lektion 9 von 34

Strings

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

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

 Scala 3
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ürzer

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

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

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

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:

 Scala 3
val gedicht =
  """Stufe um Stufe
    |steigt man hinauf,
    |nicht alle auf einmal.""".stripMargin

stripMargin 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

MethodeErgebnis 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
reverseZeichen in umgekehrter Reihenfolge
toIntOption"42".toIntOption ergibt Some(42), "x".toIntOption ergibt None
isBlanktrue, 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.:

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

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

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

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

Passt dazu