Kotlin中的响应式编程:kotlinx.coroutines与Flow库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin中的响应式编程:kotlinx.coroutines与Flow的强大力量



响应式编程是一种面向异步数据流处理和变化传播的编程范式。在Kotlin生态系统中,实现响应式模式的主要工具是kotlinx.coroutines库,更确切地说是其Flow组件。与RxJava不同,Flow与协程紧密集成,使代码更加简洁和安全。



Flow的基本概念



Flow是一种冷异步数据流,它按顺序发射值。它支持:

  • 冷流——只有在有订阅者(终端操作符)时才开始生成数据。
  • 执行上下文——流可以在不同的协程调度器之间切换。
  • 通过协程取消——取消父协程会自动终止Flow。


安装与配置

要使用Flow,请在build.gradle.kts中添加依赖:

dependencies {    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")}


创建与消费Flow

创建一个带延迟的简单数字流:

import kotlinx.coroutines.*import kotlinx.coroutines.flow.*

fun simpleFlow(): Flow<Int> = flow { for (i in 1..5) { delay(100) // 模拟异步操作 emit(i) // 发射值 }}

fun main() = runBlocking { simpleFlow().collect { value -> println("接收到: $value") }}

在这个例子中,flow { ... }创建了一个冷流,而collect是启动执行的终端操作符。



使用操作符进行数据转换

Flow提供了丰富的操作符,类似于RxJava:

  • map——转换每个值。
  • filter——按条件过滤值。
  • flatMapConcat——顺序合并流。
  • catch——处理流内部的异常。

操作符示例:

fun transformFlow(): Flow<String> = flow {    emit("Kotlin")    emit("Java")    emit("Python")}.map { it.lowercase() } .filter { it.startsWith("k") }

fun main() = runBlocking { transformFlow().collect { println(it) } // 输出: kotlin}


错误处理与完成

Flow允许通过catch优雅地处理异常,并通过onCompletion执行完成操作:

fun errorProneFlow(): Flow<Int> = flow {    emit(1)    emit(2)    throw RuntimeException("错误!")    emit(3) // 不会执行}

fun main() = runBlocking { errorProneFlow() .catch { e -> println("捕获到错误: ${e.message}") } .onCompletion { println("流已完成") } .collect { println(it) }}// 输出: 1, 2, 捕获到错误: 错误!, 流已完成


热流:StateFlow和SharedFlow

与冷Flow不同,StateFlow和SharedFlow是热流,它们保存状态并可以有多个订阅者。



StateFlow

用于存储和观察状态(例如在ViewModel中):

class CounterViewModel {    private val _counter = MutableStateFlow(0)    val counter: StateFlow<Int> = _counter.asStateFlow()

fun increment() { _counter.value++ }}

// 在Activity或Fragment中lifecycleScope.launch { viewModel.counter.collect { value -> textView.text = "计数: $value" }}


SharedFlow

适用于

推荐