本篇解析 example-flow-22.kt。学习一种比 zip 更灵活的流组合方式。
1. 核心操作符:combine
combine 也用于组合两个流,但它不要求元素一一对应。
工作原理:
- 最新值组合:只要其中任何一个流发射了新值,
combine就会取两个流中各自最新的值进行组合并发射。 - 不等待同步:快流不需要等待慢流。
2. 代码解析
1 | val nums = (1..3).asFlow().onEach { delay(300) } // 每 300ms 产出一个 |
- 结果分析:
- 400ms:
strs产出 “one”,此时nums最新值是 1 -> 输出1 -> one。 - 600ms:
nums产出 2,此时strs最新值仍是 “one” -> 输出2 -> one。 - 800ms:
strs产出 “two”,此时nums最新值是 2 -> 输出2 -> two。 - … 依此类推。
- 400ms:
3. 开发者感悟
combine 在 UI 开发中极其常用。例如:你的界面有两个输入框(用户名和密码),只有当两个输入框都校验通过时,登录按钮才可用。你可以将两个输入框的 TextFlow 进行 combine,任何一个变化都会触发按钮状态的重新计算。