Skip to content

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 通常是最佳选择,因为它能自动取消过期的异步操作,节省资源。