Einführung in Flow: Was ist das und wozu braucht man es?
Flow ist eine Bibliothek für die Arbeit mit reaktiven Datenströmen (reactive streams) in der Programmiersprache Kotlin. Sie ist Teil der Kotlin Coroutines-Ökosystems und bietet eine leistungsstarke, typsichere und asynchrone Möglichkeit zur Verarbeitung von Datensequenzen, die im Laufe der Zeit erzeugt werden.
Im Gegensatz zu normalen Collections (List, Set), die alle Elemente sofort im Speicher halten, ist Flow ein kalter Strom (cold stream). Das bedeutet, dass Daten erst dann generiert werden, wenn ein Abonnent (collector) vorhanden ist. Flow eignet sich ideal für:
- Asynchrone Datenverarbeitung: Abrufen von Daten aus dem Netzwerk, einer Datenbank oder dem Dateisystem, ohne den Hauptthread zu blockieren.
- Ereignisverarbeitung: Klicks, Mausbewegungen, UI-Updates.
- Reaktive Programmierung: Erstellen von Daten-Transformationsketten (map, filter, flatMap) mit automatischer Fehlerbehandlung und Abbrechbarkeit.
- Integration mit Coroutinen: Flow ist vollständig kompatibel mit Kotlin Coroutines, was die Kombination mit anderen asynchronen Operationen erleichtert.
Warum Flow anstelle von älteren Ansätzen (z. B. RxJava oder Callbacks) verwenden?
- Einfachheit und Prägnanz: Die Flow-API ist minimalistisch und intuitiv für Kotlin-Entwickler.
- Sicherheit: Typsicherheit auf Compiler-Ebene.
- Integration mit Coroutinen: Nutzt alle Vorteile der strukturierten Nebenläufigkeit (structured concurrency).
- Leistung: Leichtgewichtig und effizient, erzeugt keine überflüssigen Objekte.
Flow Installation
Flow ist Teil der Bibliothek kotlinx.coroutines. Um es zu nutzen, musst du die Abhängigkeit in deine build.gradle.kts-Datei (für Gradle) oder pom.xml (für Maven) einfügen.
Gradle (Kotlin DSL)
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
// Für die Verwendung von Flow in Android (mit Lifecycle-Unterstützung)
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1")
}
Gradle (Groovy)
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
}
Maven
org.jetbrains.kotlinx
kotlinx-coroutines-core
1.8.1
Wichtig: Stelle sicher, dass die Kotlin-Version und die Version von kotlinx-coroutines kompatibel sind. Die aktuelle Version findest du auf GitHub.
Schnellstart: Dein erster Flow
Lass uns einen einfachen Flow erstellen, der drei Zahlen mit einer Verzögerung ausgibt, und dann darauf abonnieren.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun simpleFlow(): Flow<Int> = flow {
println("Flow gestartet")
for (i in 1..3) {
delay(100) // Simuliert asynchrone Arbeit
emit(i) // Gibt den Wert aus
}
}
fun main() = runBlocking {
println("Hauptthread: ${Thread.currentThread().name}")
// Abonniere den Flow (sammle die Daten)
simpleFlow().collect { value ->
println("Erhalten: $value")
}
println("Flow beendet")
}
Ausgabe:
Hauptthread: main
Flow gestartet
Erhalten: 1
Erhalten: 2
Erhalten: 3
Flow beendet
Erklärung:
flow { ... }— erstellt einen kalten Strom
Auch in der Bibliothek
Caching in Go (Golang): Redis, Gruppen- und In-Memory-Caching
CLI-Frameworks für Go (Golang): Ein vollständiger Überblick über Tools zur Erstellung von Konsolenanwendungen
Geolokalisierung und Karten in Swift für iOS/macOS: vollständiger Leitfaden
PDF-Berichte in Java mit iText und Apache PDFBox generieren