0Pricing
Scala for Backend Engineering & Functional Programming · Lektion

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 cond filtert 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.

Alle Lektionen in diesem Kurs

  1. for desugaren
  2. Mit if filtern
  3. Mehrere Generatoren
  4. Verwendung mit Option und Future
← Zurück zu Scala for Backend Engineering & Functional Programming