Flow 组合:22. Combine 组合最新值

本篇解析 example-flow-22.kt。学习一种比 zip 更灵活的流组合方式。

1. 核心操作符:combine

combine 也用于组合两个流,但它不要求元素一一对应。

工作原理:

  • 最新值组合:只要其中任何一个流发射了新值,combine 就会取两个流中各自最新的值进行组合并发射。
  • 不等待同步:快流不需要等待慢流。

2. 代码解析

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

nums.combine(strs) { a, b -> "$a -> $b" }.collect { ... }
  • 结果分析
    1. 400ms:strs 产出 “one”,此时 nums 最新值是 1 -> 输出 1 -> one
    2. 600ms:nums 产出 2,此时 strs 最新值仍是 “one” -> 输出 2 -> one
    3. 800ms:strs 产出 “two”,此时 nums 最新值是 2 -> 输出 2 -> two
    4. … 依此类推。

3. 开发者感悟

combine 在 UI 开发中极其常用。例如:你的界面有两个输入框(用户名和密码),只有当两个输入框都校验通过时,登录按钮才可用。你可以将两个输入框的 TextFlow 进行 combine,任何一个变化都会触发按钮状态的重新计算。

,