Mit if filtern
Guards in Comprehensions
Mit if filtern ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Scala for Backend Engineering & Functional Programming-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.
Guards in for-comprehensions
Innerhalb einer for-comprehension können Sie eine if-Bedingung hinzufügen, die als Guard bezeichnet wird. Sie behält nur die Elemente bei, die die Bedingung erfüllen, genau wie filter.
object Main {
def main(args: Array[String]): Unit = {
val evens = for (x <- 1 to 10 if x % 2 == 0) yield x
println(evens)
}
}Guards werden zu withFilter
Ein Guard if cond wird in einen Aufruf von withFilter umgeschrieben (eine lazy Variante von filter).
for (x <- xs if p(x)) yield x- wird zu
xs.withFilter(p).map(x => x)
object Main {
def main(args: Array[String]): Unit = {
val sugar = for (x <- List(1, 2, 3, 4) if x > 2) yield x
val desugared = List(1, 2, 3, 4).withFilter(_ > 2).map(x => x)
println(sugar == desugared)
}
}Warum withFilter statt filter?
withFilter ist lazy: Es erstellt keine Zwischen-Collection. Die Bedingung wird erst ausgewertet, wenn das nachfolgende map oder flatMap ausgeführt wird. Das spart Speicher und Rechenaufwand.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3, 4, 5, 6)
val result = for (n <- nums if n % 3 == 0) yield n * 100
println(result)
}
}Mehrere Guards
Sie können mehrere Guards verketten. Sie werden wie ein logisches UND kombiniert: Ein Element muss alle Bedingungen erfüllen, um beibehalten zu werden.
object Main {
def main(args: Array[String]): Unit = {
val result = for {
x <- 1 to 20
if x % 2 == 0
if x % 3 == 0
} yield x
println(result)
}
}Guards mit mehreren Generatoren
Guards können nach jedem Generator stehen und die jeweilige Iterationsebene filtern. Platzieren Sie den Guard direkt hinter dem Generator, dessen Werte er prüft.
object Main {
def main(args: Array[String]): Unit = {
val coprimeSums = for {
x <- 1 to 3
y <- 1 to 3
if x != y
} yield (x, y)
println(coprimeSums)
}
}Einen Guard und eine Wertbindung kombinieren
Sie können Guards (if) und Wertbindungen (=) beliebig kombinieren. Die Reihenfolge ist wichtig: Eine vor einem Guard definierte Bindung kann innerhalb dieses Guards verwendet werden.
object Main {
def main(args: Array[String]): Unit = {
val result = for {
x <- 1 to 6
square = x * x
if square > 10
} yield square
println(result)
}
}Guards bei String-Collections
Guards funktionieren mit jedem Prädikat, nicht nur mit numerischen. Hier filtern wir Wörter nach ihrer Länge.
object Main {
def main(args: Array[String]): Unit = {
val words = List("scala", "go", "java", "rust", "c")
val longWords = for (w <- words if w.length >= 4) yield w.toUpperCase
println(longWords)
}
}Options filtern
Bei einem Option wandelt ein nicht erfüllter Guard das Ergebnis in None um. Dadurch eignen sich for-comprehensions hervorragend zum Validieren optionaler Werte.
object Main {
def main(args: Array[String]): Unit = {
val ok = for (x <- Some(8) if x > 5) yield x
val bad = for (x <- Some(3) if x > 5) yield x
println(ok)
println(bad)
}
}Die Position des Guards verändert die Bedeutung
Ein Guard sieht nur Werte, die oberhalb von ihm gebunden wurden. Wenn Sie ihn vor einen Generator setzen, den er benötigt, lässt sich der Code nicht kompilieren. Platzieren Sie einen Guard immer nach dem entsprechenden Generator.
object Main {
def main(args: Array[String]): Unit = {
val result = for {
x <- 1 to 3
y <- 1 to 3
if x + y == 4
} yield s"$x + $y = ${x + y}"
result.foreach(println)
}
}Guards im Vergleich zu einem abschließenden Filter
Sie könnten das Ergebnis nach der Comprehension filtern, aber ein Guard filtert während der Iteration. Bei mehreren Generatoren können Guards Zweige frühzeitig abschneiden, sodass insgesamt weniger Arbeit anfällt.
object Main {
def main(args: Array[String]): Unit = {
val withGuard = for {
x <- 1 to 100
if x % 25 == 0
} yield x
println(withGuard)
}
}Lesbare Validierungspipelines
Mehrere aufeinanderfolgende Guards lesen sich wie eine Checkliste von Bedingungen. Das ist eine der idiomatischsten Verwendungen von For-Comprehensions in echtem Scala-Code.
object Main {
def main(args: Array[String]): Unit = {
val valid = for {
n <- List(4, 7, 12, 15, 20)
if n > 5
if n < 18
if n % 2 == 0
} yield n
println(valid)
}
}Schnelltest
In welche Methode wird ein Guard (if) in einer For-Comprehension bei der Auflösung übersetzt?
Zusammenfassung
Sie haben Guards in For-Comprehensions kennengelernt:
if condfiltert Elemente während der Iteration- Guards werden in
withFilterübersetzt (verzögertes Filtern) - Mehrere Guards werden wie ein logisches UND kombiniert
- Ein Guard sieht nur Werte, die oberhalb von ihm gebunden wurden
- Guards lassen sich frei mit Generatoren und
=-Bindings kombinieren
Häufig gestellte Fragen
Ist die Lektion „Mit if filtern“ kostenlos?
Ja — der vollständige Text von „Mit if filtern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Scala for Backend Engineering & Functional Programming-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Mit if filtern“?
Guards in Comprehensions Du übst Scala for Backend Engineering & Functional Programming mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Scala for Backend Engineering & Functional Programming zu starten?
Keine Vorkenntnisse erforderlich. Scala for Backend Engineering & Functional Programming auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Mit if filtern“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Scala for Backend Engineering & Functional Programming-Lektion Code schreiben und ausführen?
Ja. Jede Scala for Backend Engineering & Functional Programming-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.