Kurz: Scala ist statisch typisiert mit starker Typinferenz. Alles ist ein Objekt, auch Zahlen.
Teil des Kurses Scala
Typen
Scala ist statisch typisiert mit starker Typinferenz. Alles ist ein Objekt, auch Zahlen.
@main def main(): Unit =
val i = 42
val d = 3.14
val s = "Text"
val c = 'x'
val b = true
val l = 3_000_000_000L
println(s"${i.getClass.getSimpleName} ${d.getClass.getSimpleName} ${s.getClass.getSimpleName} ${c.getClass.getSimpleName}")
println(s"${7 / 2} ${7 % 3} ${7 / 2.0} ${math.pow(2, 10)} ${math.sqrt(144)} ${math.abs(-5)} ${math.max(3, 9)}")
println(s"${i.toDouble} ${d.toInt} ${i.toString + "!"} ${"123".toInt + 1} ${"2.5".toDouble} ${"x".toIntOption} ${"7".toIntOption}")
println(s"${5.max(3)} ${5.min(3)} ${10.toBinaryString} ${255.toHexString} ${i.isValidInt} ${1 to 5} ${(1 to 5).toList}")
val text = "Hallo Welt"
println(s"${text.length} ${text.toUpperCase} ${text.substring(0, 5)} ${text.contains("Welt")} ${text.indexOf("W")}")
println(s"${text.split(" ").toList} ${text.replace("l", "L")} ${text.reverse} ${text.take(3)} ${text.drop(6)} ${"ab" * 3}")
println(s"${text.charAt(0)} ${text(1)} ${text.startsWith("Hal")} ${" trim ".trim} ${text.toList.take(3)} ${text.count(_ == 'l')}")
println("Mehrzeilig:\n" + """Zeile 1
|Zeile 2 mit "Anführungszeichen"
|""".stripMargin)Ausgabe:
int double String char
3 1 3.5 1024.0 12.0 5 9
42.0 3 42! 124 2.5 None Some(7)
5 3 1010 ff true Range 1 to 5 List(1, 2, 3, 4, 5)
10 HALLO WELT Hallo true 6
List(Hallo, Welt) HaLLo WeLt tleW ollaH Hal Welt ababab
H a true trim List(H, a, l) 3
Mehrzeilig:
Zeile 1
Zeile 2 mit "Anführungszeichen"Optionen statt null
Scala vermeidet null: Ein möglicher fehlender Wert ist eine Option[T] (Some(x) oder None).
def finde(liste: List[Int], ziel: Int): Option[Int] =
val idx = liste.indexOf(ziel)
if idx >= 0 then Some(idx) else None
@main def main(): Unit =
val liste = List(5, 8, 13, 21)
val a = finde(liste, 13)
val b = finde(liste, 99)
println(s"$a $b")
println(s"${a.getOrElse(-1)} ${b.getOrElse(-1)}")
println(a.map(_ * 10))
println(b.map(_ * 10))
println(s"${a.isDefined} ${b.isEmpty}")
a match
case Some(i) => println(s"gefunden an $i")
case None => println("nicht gefunden")
println(s"${liste.headOption} ${List.empty[Int].headOption}")
println(Option("text").filter(_.length > 10))
println(for x <- a; y <- Some(2) yield x * y)Ausgabe:
Some(2) None
2 -1
Some(20)
None
true true
gefunden an 2
Some(5) None
None
Some(4)Kontrollfluss
@main def main(): Unit =
val punkte = 78
if punkte >= 90 then println("sehr gut")
else if punkte >= 75 then println("gut")
else println("weiter üben")
val note = punkte match // match ist ein mächtiges switch
case p if p >= 90 => "A"
case p if p >= 75 => "B"
case _ => "C"
println(note)
val tag = 3
tag match
case 1 => println("Montag")
case 2 | 3 | 4 => println("Mitte der Woche")
case n if n >= 5 && n <= 7 => println("Ende der Woche")
case _ => println("anderes")
for i <- 1 to 3 do print(s"$i ")
println()
for i <- 10 to 1 by -4 do print(s"$i ")
println()
for i <- 0 until 3 do print(s"$i ")
println()
for (name, idx) <- List("rot", "grün", "blau").zipWithIndex do print(s"$idx:$name ")
println()
for x <- 1 to 10 if x % 3 == 0 do print(s"$x ") // Filter in der Schleife
println()
var n = 3
while n > 0 do
print(s"$n ")
n -= 1
println()
println(for x <- 1 to 5 yield x * x) // yield erzeugt eine CollectionAusgabe:
gut
B
Mitte der Woche
1 2 3
10 6 2
0 1 2
0:rot 1:grün 2:blau
3 6 9
3 2 1
Vector(1, 4, 9, 16, 25)Funktionen
def addiere(a: Int, b: Int): Int = a + b
def quadrat(x: Int) = x * x // Rückgabetyp wird erschlossen
def gruss(name: String, anrede: String = "Hallo"): String = s"$anrede, $name!"
def summe(zahlen: Int*): Int = zahlen.sum // variable Argumente
def fakultaet(n: BigInt): BigInt = if n <= 1 then 1 else n * fakultaet(n - 1)
@scala.annotation.tailrec
def ggT(a: Int, b: Int): Int = if b == 0 then a else ggT(b, a % b) // Endrekursion
def minMax(l: List[Int]): (Int, Int) = (l.min, l.max) // Tupel als Rückgabe
val verdopple: Int => Int = x => x * 2 // Funktion als Wert
def wendeAn(f: Int => Int, x: Int): Int = f(x)
def addierer(n: Int): Int => Int = x => x + n // Funktion als Rückgabe
@main def main(): Unit =
println(s"${addiere(2, 3)} ${quadrat(7)} ${gruss("Mia")} ${gruss("Tom", "Hi")} ${gruss(anrede = "Servus", name = "Zoe")}")
println(s"${summe(1, 2, 3, 4)} ${fakultaet(25)} ${ggT(48, 18)} ${minMax(List(4, 9, 1))}")
println(s"${verdopple(21)} ${wendeAn(_ + 1, 41)} ${addierer(5)(10)}")
val (lo, hi) = minMax(List(4, 9, 1, 7))
println(s"$lo $hi")Ausgabe:
5 49 Hallo, Mia! Hi, Tom! Servus, Zoe!
10 15511210043330985984000000 6 (1,9)
42 42 15
1 9Merke
- Statisch typisiert mit Inferenz; alles ist ein Objekt
Option[T]mitSome/Nonestattnullif/matchsind Ausdrücke;for ... yield; Bereiche1 to 5,until- Funktionen:
def, Standardwerte,Int*, Funktionen als Werte,@tailrec
Übungsaufgabe
Schreibe FizzBuzz für 1 bis 30 mit match.
Quiz zur Selbstkontrolle
Wofür steht Option?
- Ein Wert, der vorhanden (Some) oder nicht vorhanden (None) sein kann (richtig)
- Ein optionaler Parameter
- Eine Einstellung
- Ein Fehlertyp
Was liefert for x <- 1 to 3 yield x * 2?
- Eine Collection mit 2, 4, 6 (richtig)
- Die Zahl 6
- Nichts
- Einen Fehler
Wofür steht @tailrec?
- Der Compiler prüft Endrekursion (richtig)
- Der Code wird übersprungen
- Die Funktion läuft parallel
- Die Funktion ist privat
Weiter im Kurs
Zurück: Einführung und erstes Programm
Weiter: Collections und Pattern Matching
Alle Kapitel: Scala im Überblick