Lazy entnehmen und filtern
Schneiden Sie unendliche Streams zu.
Lazy entnehmen und filtern ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 4 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.
Verzögertes Konsumieren
Der eigentliche Wert einer LazyList zeigt sich beim Konsumieren. Operationen wie take, filter und map bleiben verzögert und berechnen nur die Zellen, die Sie letztlich erzwingen.
In dieser Lektion behandeln Sie die wichtigsten Transformer und erfahren, wie Sie die Verzögerung am richtigen Punkt beenden.
take(n)
take(n) gibt eine LazyList mit höchstens den ersten n Elementen zurück, die selbst weiterhin verzögert ist. Nichts wird berechnet, bis Sie das Ergebnis erzwingen.
Das ist die sichere Methode, einen unendlichen Datenstrom zu begrenzen.
object Demo extends App {
val first5 = LazyList.from(1).take(5)
println(first5.toList)
}takeWhile
takeWhile(p) liefert Elemente, solange das Prädikat erfüllt ist, und stoppt beim ersten Fehlschlag.
Bei einem unendlichen Datenstrom ist dies eine klare Abbruchbedingung, für die Sie keine Anzahl kennen müssen.
object Demo extends App {
val small = LazyList.from(1).takeWhile(_ < 6)
println(small.toList)
}drop und dropWhile
drop(n) überspringt die ersten n Elemente; dropWhile(p) überspringt Elemente, solange das Prädikat erfüllt ist. Beide geben den verbleibenden Teil verzögert zurück.
Verwenden Sie sie, um in einem Datenstrom an die gewünschte Stelle zu springen, bevor Sie einen Ausschnitt entnehmen.
object Demo extends App {
val rest = LazyList.from(1).drop(3).take(3)
println(rest.toList)
}Verzögertes Filtern
filter arbeitet auf einer LazyList verzögert: Elemente werden erst geprüft, wenn der nachgelagerte Konsument sie anfordert.
Zusammen mit take verarbeiten Sie genau so viele Quellenelemente, wie für die Anfrage nötig sind, und nicht mehr.
object Demo extends App {
val evens = LazyList.from(1).filter(_ % 2 == 0)
println(evens.take(4).toList)
}Die Anfrage beobachten
Fügen Sie innerhalb des Prädikats eine Ausgabe ein, um zu beobachten, wie wenige Elemente geprüft werden. Der Filter läuft nur, bis take erfüllt ist.
Führen Sie den Code aus: Die Anzahl der Zeilen mit „check“ zeigt die bedarfsgesteuerte Auswertung und nicht den gesamten Datenstrom.
object Demo extends App {
val r = LazyList.from(1).filter { n =>
println("check " + n); n % 3 == 0
}
println(r.take(2).toList)
}map und filter verketten
Sie können Transformer verketten; die gesamte Pipeline bleibt verzögert und wird pro Element zusammengeführt. Jedes Quellenelement durchläuft map und anschließend filter, sobald es angefordert wird.
Es werden keine vollständigen Zwischenkollektionen erstellt.
object Demo extends App {
val r = LazyList.from(1).map(_ * _).filter(_ > 10).take(3)
println(r.toList)
}find: Frühzeitig stoppen
find(p) gibt das erste passende Element als Option zurück und erzwingt nur die Auswertung bis zu diesem Element. Das ist ideal für die Suche in einem unendlichen Datenstrom.
Sobald eine Übereinstimmung gefunden wurde, stoppt die Auswertung sofort.
object Demo extends App {
val firstBig = LazyList.from(1).find(_ * _ > 50)
println(firstBig)
}headOption und exists
headOption gibt sicher einen Blick auf das erste Element; exists(p) erzwingt die Auswertung nur, bis eine Übereinstimmung gefunden wurde, oder für immer, wenn keine existiert. Verwenden Sie exists bei unendlichen Datenströmen nur, wenn eine Übereinstimmung garantiert ist.
Beide stoppen so früh wie möglich.
object Demo extends App {
val has = LazyList.from(1).exists(_ == 7)
println(has)
}Ein Ergebnis erzwingen
Verzögerte Transformer beschreiben die Arbeit; eine abschließende Operation erzwingt sie. toList, foreach, sum und foldLeft konsumieren den begrenzten Datenstrom und erzeugen einen konkreten Wert.
Begrenzen Sie einen unendlichen Datenstrom immer, bevor Sie eine abschließende Operation verwenden, die ihn vollständig benötigt.
object Demo extends App {
val total = LazyList.from(1).take(100).sum
println(total)
}Fallstricke beim Filtern
Ein filter, der nichts findet, macht aus einem begrenzten take eine unendliche Suche. LazyList.from(1).filter(_ < 0).take(1) hängt für immer.
Stellen Sie sicher, dass die Prädikate erfüllt werden können, oder kombinieren Sie den Filter mit takeWhile, um die Terminierung zu garantieren.
Kurzer Test
Überprüfen Sie Ihr Verständnis des verzögerten Konsumierens.
Zusammenfassung
take, takeWhile, drop, filter und map bleiben verzögert und werden pro Element zusammengeführt; find, exists und headOption stoppen frühzeitig; abschließende Operationen wie toList und sum erzwingen das Ergebnis.
Achten Sie bei unendlichen Datenströmen auf nicht erfüllbare Filter. Sie können jetzt verzögerte Sequenzen sicher erzeugen und konsumieren.
Häufig gestellte Fragen
Ist die Lektion „Lazy entnehmen und filtern“ kostenlos?
Ja — der vollständige Text von „Lazy entnehmen und 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 „Lazy entnehmen und filtern“?
Schneiden Sie unendliche Streams zu. 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 4 von 4.
Wie lange dauert die Lektion „Lazy entnehmen und 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
- Lazy Evaluation erklärt
- Eine LazyList erstellen
- Unendliche Streams
- Lazy entnehmen und filtern