Flow 性能:18. Conflate 合并最新值

本篇解析 example-flow-18.kt。学习如何处理消费能力严重不足的情况。

1. 核心操作符:conflate()

当收集器处理速度远慢于发射速度时,如果你不关心中间值,只想要最新的数据,可以使用 conflate()

工作原理:

  • 跳过中间值:当收集器正在忙于处理一个元素时,如果发射端又产出了多个新值,conflate 会直接丢弃旧的中间值,只保留最新的那一个。
  • 不阻塞发射:发射端可以一直运行,不需要等待收集端。

2. 代码解析

1
2
3
4
5
6
simple()
.conflate()
.collect { value ->
delay(300) // 耗时 300ms
println(value)
}
  • 100ms:发射 1,收集端开始处理 1(耗时 300ms)。
  • 200ms:发射 2,由于收集端在忙,2 被放入暂存。
  • 300ms:发射 3,由于收集端还在忙,2 被丢弃,3 替代 2 成为最新值。
  • 400ms:收集端处理完 1,立即开始处理最新的 3。
  • 结果:只打印了 1 和 3,中间的 2 被“合并”掉了。

3. 开发者感悟

conflate 非常适合处理高频更新的 UI 状态。例如:股票行情或进度条更新。用户不需要看到每一个细微的数字变化,他们只需要看到当前的最新状态即可。这能极大减轻 UI 线程的压力。

,