Flow 组合、展平与变换
多流处理是响应式编程的精髓。
组合三剑客:Merge, Zip, Combine
1. Merge (并发合流)
逻辑:把多个流的出水口接到同一根管子上。不做任何等待,谁来就发谁。
mermaid
graph TD
FlowA --> Merge
FlowB --> Merge
Merge --> Collect- 适用:合并多个网络请求结果,不关心顺序。
2. Zip (拉链配对)
逻辑:严格的一对一等待。A 发一个,B 必须发一个,才能组成一对发出。
- 适用:合并用户信息 + 用户头像(必须是同一个人的)。
3. Combine (最新组合)
逻辑:A 更新时取 B 的最新值;B 更新时取 A 的最新值。
- 适用:表单验证(用户名 + 密码 -> 按钮状态)。只要任意输入框变动,就重新计算。
kotlin
usernameFlow.combine(passwordFlow) { user, pwd ->
user.isNotEmpty() && pwd.length > 6
}.collect { isEnabled ->
submitButton.isEnabled = isEnabled
}展平流 (Flattening)
当 Flow 的元素本身也是 Flow (Flow<Flow<T>>) 时,我们需要将其展平为 Flow<T>。
| 操作符 | 行为描述 | 适用场景 |
|---|---|---|
flatMapConcat | 串行。前一个内部流结束,才订阅下一个。 | 顺序依赖任务(先登录,再获取资料) |
flatMapMerge | 并发。同时订阅所有内部流。 | 批量并发请求 |
flatMapLatest | 喜新厌旧。新流来了,立即取消旧流。 | 搜索框联想(新输入导致旧请求作废) |
性能首选
在 UI 交互场景(如搜索、Tab 切换),flatMapLatest 通常是最佳选择,因为它能自动取消过期的异步操作,节省资源。