Flow 组合:25. FlatMapLatest 处理最新流

本篇解析 example-flow-25.kt。学习一种极具响应性的嵌套流处理方式。

1. 核心操作符:flatMapLatest

flatMapLatestcollectLatest 的设计理念一致:只对最新的发射值感兴趣

工作原理:

  • 切换与取消:每当初始流发射一个新值时,如果上一个子流(由 flatMapLatest 产生)还在运行,它会立即取消旧的子流,并开启新的子流。

2. 代码解析

1
2
3
(1..3).asFlow().onEach { delay(100) } // 每 100ms 发射一个数字
.flatMapLatest { requestFlow(it) } // 启动一个耗时 500ms 的子流
.collect { println(it) }
  • 结果分析
    1. 100ms:发射 1,启动子流 1 -> 产出 1: First
    2. 200ms:发射 2。此时子流 1 还在 delay立即被取消,启动子流 2 -> 产出 2: First
    3. 300ms:发射 3。此时子流 2 还在 delay立即被取消,启动子流 3 -> 产出 3: First
    4. 800ms:子流 3 终于跑完了 500ms 的 delay -> 产出 3: Second
  • 输出1: First, 2: First, 3: First, 3: Second。只有最后一个子流完成了。

3. 开发者感悟

flatMapLatest 是处理诸如“即时搜索”的最佳方案。用户每输入一个字,我们就取消上一次的 API 请求流,开始新的请求流。这能保证 UI 始终反映用户的最后一次操作。

,