0Pricing
Kotlin Academy · Lektion

Pipelines verketten und Zwischenlisten mit Sequence vermeiden

Erstellen Sie mehrstufige Pipelines und verwenden Sie Sequence für eine verzögerte Auswertung.

Pipelines verketten und Zwischenlisten mit Sequence vermeiden ist eine kostenlose Kotlin Academy-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 Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Das Problem: Zwischenlisten

Jede Collection-Operation (filter, map usw.) erstellt eine neue Liste. Bei großen Collections oder langen Ketten verschwendet das Speicher und Zeit.

Eifrige vs. verzögerte Auswertung

Collection-Operationen werden eifrig ausgewertet: Jeder Schritt verarbeitet die Liste vollständig, bevor der nächste beginnt. Sequence-Operationen werden verzögert ausgewertet: Ein Element wird durch alle Schritte verarbeitet, bevor das nächste Element an die Reihe kommt.

In eine Sequence umwandeln

Rufen Sie asSequence() auf, um von der eifrigen Verarbeitung (Liste) zur verzögerten Verarbeitung (Sequence) zu wechseln.
val result = (1..1_000_000)
    .asSequence()
    .filter { it % 2 == 0 }
    .map { it * it }
    .take(5)
    .toList()
println(result)  // [4, 16, 36, 64, 100]

Sequence ist verzögert: keine Arbeit ohne Terminaloperation

Es findet keine Berechnung statt, bis Sie einen Terminaloperator aufrufen (toList, first, sum usw.).
val seq = generateSequence(1) { it + 1 }  // infinite!
    .filter { it % 3 == 0 }
    .map { it * it }
val first5 = seq.take(5).toList()
println(first5)  // [9, 36, 81, 144, 225]

generateSequence: unendliche Sequenzen

generateSequence erstellt verzögert ausgewertete, unendliche Sequenzen.
val fibonacci = generateSequence(Pair(0, 1)) { (a, b) -> Pair(b, a + b) }
    .map { it.first }
val first10 = fibonacci.take(10).toList()
println(first10)  // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

sequence-Builder

Der Builder sequence { } erstellt mit yield eigene, verzögert ausgewertete Sequenzen.
val evens = sequence {
    var n = 0
    while (true) {
        yield(n)
        n += 2
    }
}
println(evens.take(5).toList())  // [0, 2, 4, 6, 8]

Wann Sie Sequence verwenden sollten

Verwenden Sie Sequence, wenn die Collection groß ist (>1000 Elemente), Sie mehrere Operationen verketten und/oder nur eine kleine Teilmenge der Ergebnisse benötigen.

Wann Sie Sequence NICHT verwenden sollten

Bei kleinen Collections (<100 Elemente) verursachen Sequences zusätzlichen Aufwand. Der auf Iteratoren basierende Mechanismus ist bei kurzen Ketten langsamer.
// Overkill for small list:
listOf(1, 2, 3).asSequence().map { it * 2 }.toList()
// Just use:
listOf(1, 2, 3).map { it * 2 }

Terminaloperationen von Sequence

Terminaloperationen lösen die Verarbeitung aus. Häufige Beispiele sind: toList(), first(), last(), count(), sum(), any(), all(), none().
val s = (1..100).asSequence().filter { it % 7 == 0 }
println(s.first())          // 7
println(s.count())          // 14
println(s.sum())            // 728

Zustandsbehaftete vs. zustandslose Operationen

Einige Sequence-Operationen sind zustandsbehaftet (sort, distinct) – sie müssen alle Elemente sehen, bevor sie eine Ausgabe erzeugen können. Dadurch wird die verzögerte Auswertung unterbrochen.
val s = (1..10).asSequence()
    .filter { it > 3 }   // stateless: lazy
    .sorted()            // stateful: must see all elements
    .take(3).toList()
println(s)  // [4, 5, 6]

constrainOnce: Sicherheit bei einmaliger Iteration

Verwenden Sie constrainOnce(), damit eine Sequence einen Fehler auslöst, wenn sie mehrmals durchlaufen wird – nützlich für Streams.
val seq = generateSequence(1) { if (it < 5) it + 1 else null }
    .constrainOnce()
val first = seq.toList()   // OK
// val second = seq.toList()  // IllegalStateException!

Kurze Überprüfung

Wann beginnt eine Sequence mit der Verarbeitung von Elementen?

Zusammenfassung

Sequences werden verzögert ausgewertet – ohne Terminaloperator findet keine Arbeit statt. Verwenden Sie asSequence() für große Collections mit mehreren verketteten Operationen. generateSequence und sequence { } erstellen unendliche, verzögert ausgewertete Streams. Terminaloperatoren lösen die Verarbeitung aus.

Häufig gestellte Fragen

Ist die Lektion „Pipelines verketten und Zwischenlisten mit Sequence vermeiden“ kostenlos?

Ja — der vollständige Text von „Pipelines verketten und Zwischenlisten mit Sequence vermeiden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Pipelines verketten und Zwischenlisten mit Sequence vermeiden“?

Erstellen Sie mehrstufige Pipelines und verwenden Sie Sequence für eine verzögerte Auswertung. Du übst Kotlin Academy 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 Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy 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 „Pipelines verketten und Zwischenlisten mit Sequence vermeiden“?

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 Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-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. map und flatMap: Jedes Element umwandeln
  2. filter, filterNot und partition
  3. fold, reduce und runningFold
  4. Pipelines verketten und Zwischenlisten mit Sequence vermeiden
← Zurück zu Kotlin Academy