Scala for Backend Engineering & Functional Programming · Lektion

Eine LazyList erstellen

Erstellen Sie faule Sequenzen.

Lektion 2 von 413 Schritte

Eine LazyList erstellen 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.

Grundlagen der Erstellung

Es gibt mehrere Möglichkeiten, eine LazyList zu erstellen. Am einfachsten ist die apply-Factory, ähnlich wie beim Erstellen einer List.

Die eigentliche Stärke entsteht jedoch durch Konstruktoren, die das Ende lazy halten. Diese sehen wir uns in dieser Lektion an.

val ll = LazyList(10, 20, 30)
println(ll.head)

Die leere LazyList

LazyList.empty ist der Abschluss, also das lazy Gegenstück zu Nil. Jede endliche LazyList endet damit.

Sie verwenden es als Basisfall, wenn Sie mit #:: Elemente voranstellen.

object Demo extends App {
  val empty = LazyList.empty[Int]
  println(empty.isEmpty)
  println(empty.toList)
}

Voranstellen mit #::

Der Operator #:: setzt einen Kopf vor ein By-name-Ende. Bauen Sie eine Liste von rechts nach links auf und schließen Sie mit LazyList.empty ab.

Da #:: sein Ende lazy übernimmt, wird nichts hinter dem Kopf aufgebaut, bis es erzwungen wird.

object Demo extends App {
  val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
  println(ll.toList)
}

Lazy Evaluation beobachten

Fügen Sie einen Seiteneffekt in das Ende ein, um zu sehen, wann er ausgeführt wird. Erst das Erzwingen des Endes löst ihn aus.

Führen Sie den Code aus: "building tail" wird erst ausgegeben, nachdem Sie auf das zweite Element zugreifen, nicht bereits bei der Definition der LazyList.

object Demo extends App {
  val ll = 1 #:: { println("building tail"); 2 #:: LazyList.empty }
  println("defined")
  println(ll.head)
  println(ll(1))
}

cons explizit verwenden

Intern ist #:: gleichbedeutend mit LazyList.cons. Sowohl Kopf als auch Ende werden in cons by name ausgewertet, wodurch Sie die Auswertung vollständig kontrollieren können.

Das ist nützlich, wenn Sie rekursive Generatoren definieren.

val ll = LazyList.cons(1, LazyList.cons(2, LazyList.empty))
println(ll.head)

Rekursive Generatoren

Eine LazyList kann auf sich selbst verweisen. Definieren Sie eine Funktion, die einen Kopf erzeugt und sich für das Ende rekursiv selbst aufruft.

Da das Ende by name ausgewertet wird, läuft die Rekursion nicht unendlich weiter, sondern pausiert, bis jede Zelle angefordert wird.

def countFrom(n: Int): LazyList[Int] =
  n #:: countFrom(n + 1)

println(countFrom(5).take(3).toList)

Einen Generator ausführen

Führen wir einen rekursiven Generator aus und rufen einige Werte ab. take begrenzt, wie viele Zellen erzwungen werden.

Ohne take würde die Berechnung unendlich laufen. Begrenzen Sie einen unendlichen Generator daher immer, bevor Sie seine Auswertung erzwingen.

object Demo extends App {
  def countFrom(n: Int): LazyList[Int] =
    n #:: countFrom(n + 1)
  println(countFrom(1).take(5).toList)
}

Aus einem Iterator

Sie können eine vorhandene Collection oder einen Iterator einbinden. LazyList.from(start) erstellt eine unendliche Zählfolge, und someList.to(LazyList) konvertiert bereits bekannte Daten eager.

Damit erhalten Sie eine lazy Sicht auf Daten, die bereits vorhanden sind oder sich beschreiben lassen.

object Demo extends App {
  val ll = List(1, 2, 3).to(LazyList)
  println(ll.map(_ * 2).toList)
}

LazyList.iterate

LazyList.iterate(seed)(f) wendet f wiederholt an, um aus dem vorherigen Element jeweils das nächste zu erzeugen.

Das ist eine klare Möglichkeit, Sequenzen auszudrücken, die durch eine Schrittregel definiert sind, etwa Zweierpotenzen.

object Demo extends App {
  val powers = LazyList.iterate(1)(_ * 2)
  println(powers.take(6).toList)
}

LazyList.continually

LazyList.continually(expr) wiederholt einen Ausdruck unendlich oft und wertet ihn für jedes Element erneut aus. Das ist praktisch für konstante oder zufällige Datenströme.

Kombinieren Sie es mit take, um einen endlichen Ausschnitt zu erhalten.

object Demo extends App {
  val zeros = LazyList.continually(0)
  println(zeros.take(4).toList)
}

Den passenden Konstruktor auswählen

Verwenden Sie apply für kleine, feste Listen, #:: oder cons für selbst geschriebene Rekursion, iterate für Schrittregeln, from zum Zählen und continually für Wiederholungen.

Alle halten das Ende lazy. Bei der Auswahl geht es daher um die Ausdrucksstärke.

Schnelltest

Prüfen Sie Ihr Verständnis der Erstellung von LazyLists.

Zusammenfassung

Sie haben LazyLists mit apply, empty, #::/cons, iterate, from und continually erstellt.

Das By-name-Ende macht selbstreferenzielle, potenziell unendliche Generatoren sicher definierbar. Als Nächstes nutzen wir dies, um tatsächlich unendliche Datenströme zu erstellen.

Kostenlos starten

Lerne Scala mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
39
Lektionen
143

Häufig gestellte Fragen

Ist die Lektion „Eine LazyList erstellen“ kostenlos?

Ja — der vollständige Text von „Eine LazyList erstellen“ 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 „Eine LazyList erstellen“?

Erstellen Sie faule Sequenzen. 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 „Eine LazyList erstellen“?

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. Lazy Evaluation erklärt
  2. Eine LazyList erstellen
  3. Unendliche Streams
  4. Lazy entnehmen und filtern
← Zurück zu Scala for Backend Engineering & Functional Programming