跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kotlin流(Flow)
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kotlin流(Flow) = == 介绍 == '''Kotlin流(Flow)'''是Kotlin协程库中用于处理异步数据流的API,它以响应式编程的方式按顺序发射多个值。Flow的设计灵感来源于Reactive Streams(如RxJava),但完全基于协程实现,提供更轻量级且符合Kotlin习惯的解决方案。 核心特点: * '''冷流(Cold Stream)''':只有在收集(collect)时才会执行发射逻辑 * '''可取消支持''':与协程生命周期绑定 * '''背压(Backpressure)'''处理:通过挂起函数天然支持 * '''操作符丰富''':提供类似集合的转换操作(map、filter等) == 基础使用 == 最简单的Flow通过`flow`构建器创建: <syntaxhighlight lang="kotlin"> import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun simpleFlow(): Flow<Int> = flow { for (i in 1..3) { delay(100) // 模拟异步操作 emit(i) // 发射值 } } fun main() = runBlocking { simpleFlow().collect { value -> println(value) } } </syntaxhighlight> 输出: <pre> 1 2 3 </pre> === 关键组件 === <mermaid> graph LR A[生产者] -->|emit| B(Flow) B -->|collect| C[消费者] C -->|处理| D[结果] </mermaid> * '''生产者''':通过`emit()`发射数据 * '''Flow''':数据传输管道 * '''消费者''':通过`collect()`接收数据 == 操作符 == Flow提供两类操作符: === 中间操作符 === 不立即执行,返回新Flow: <syntaxhighlight lang="kotlin"> flowOf(1,2,3) .map { it * it } // 转换 .filter { it % 2 != 0 }// 过滤 .collect(::println) // 输出:1, 9 </syntaxhighlight> === 末端操作符 === 触发流执行: * `collect()`:收集所有值 * `first()`:获取第一个值 * `toList()`:转换为集合 * `reduce()`:累积计算 == 异常处理 == 使用`catch`操作符捕获异常: <syntaxhighlight lang="kotlin"> flow { emit(1) throw RuntimeException("Error!") }.catch { e -> println("Caught: $e") }.collect(::println) </syntaxhighlight> == 上下文控制 == 默认遵循'''上下文保留'''(Context Preservation)原则,可通过`flowOn`切换上下文: <syntaxhighlight lang="kotlin"> flow { println("Emitting in ${Thread.currentThread().name}") emit(1) }.flowOn(Dispatchers.IO) .collect { println("Collecting in ${Thread.currentThread().name}") } </syntaxhighlight> == 高级特性 == === 状态流(StateFlow) === 热流实现,自动保存最新状态: <syntaxhighlight lang="kotlin"> val state = MutableStateFlow(0) fun update() = runBlocking { state.collect { println("State: $it") } state.value = 1 // 触发更新 } </syntaxhighlight> === 共享流(SharedFlow) === 支持多订阅者的热流: <syntaxhighlight lang="kotlin"> val sharedFlow = MutableSharedFlow<Int>() fun producer() = CoroutineScope(Dispatchers.Default).launch { repeat(5) { sharedFlow.emit(it) delay(100) } } </syntaxhighlight> == 实际案例 == '''场景''':实现实时搜索建议 <syntaxhighlight lang="kotlin"> fun searchFlow(query: String): Flow<List<Result>> = flow { val api = SearchApi() emit(api.suggest(query)) // 首次快速结果 delay(300) // 防抖 emit(api.fullSearch(query)) // 完整结果 } // UI层使用 viewModelScope.launch { searchQuery.asFlow() .debounce(300) .flatMapLatest { query -> searchFlow(query) } .collect { results -> updateUI(results) } } </syntaxhighlight> == 性能优化 == * 使用`buffer()`并行处理生产-消费 * 对快速发射流使用`conflate()`跳过中间值 * 复杂计算使用`flowOn`切换调度器 == 数学表示 == Flow可视为离散时间序列: <math> F = \{x_1, x_2, ..., x_n | x_i \in X\} </math> 其中转换操作符相当于函数组合: <math> map(f) \circ filter(p) \equiv \{f(x_i) | p(x_i) = true\} </math> == 常见问题 == '''Q: Flow与LiveData的区别?''' * Flow更灵活,支持复杂异步操作 * LiveData专为UI设计,自动感知生命周期 '''Q: 何时该用Channel替代Flow?''' * 需要跨协程通信时 * 处理一次性事件(非数据流) == 最佳实践 == 1. 避免在Flow中修改共享状态 2. 对资源使用`onCompletion`进行清理 3. 公共API返回`Flow`而非具体实现类 4. 测试时使用`test`模块的`runTest` [[Category:编程语言]] [[Category:Kotlin]] [[Category:Kotlin协程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)