Flow 组合:21. Zip 同步等待机制

本篇解析 example-flow-21.kt。探讨 zip 在处理不同速流时的行为。

1. 核心概念:等待最慢的那一个

zip 组合时,每个元素都必须成对出现。如果一个流快,另一个流慢,快的那个流必须等待慢的流产出对应的元素。

2. 代码解析

1
2
3
4
5
6
val nums = (1..3).asFlow().onEach { delay(300) } // 每 300ms 产出一个
val strs = flowOf("one", "two", "three").onEach { delay(400) } // 每 400ms 产出一个

nums.zip(strs) { a, b -> "$a -> $b" }.collect { value ->
println("$value at ${currentTimeMillis() - startTime} ms")
}
  • 结果分析
    1. 第一对 (1, one):在 400ms 后产出(等待 strs)。
    2. 第二对 (2, two):在 800ms 后产出(累加等待)。
    3. 第三对 (3, three):在 1200ms 后产出。

3. 开发者感悟

zip 具有天然的同步属性。它就像是齿轮咬合:只有两个齿轮都转到对应位置,这一格才算走完。如果你的业务场景允许两端流“各自跑,谁快谁更新”,那么你应该使用 combine 而不是 zip

,