Flow 基础:10. Take 限速操作符 (Size-limiting)

本篇解析 example-flow-10.kt。学习如何限制 Flow 的产出数量。

1. 核心概念

take(n) 操作符类似于 List 的同名函数,它只截取流中的前 n 个元素。

关键点:取消机制

  • 截断并取消:当收集到第 n 个元素后,take 会自动取消对应的协程,并触发 Flow 构建器的 finally 块。

2. 代码解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fun numbers(): Flow<Int> = flow {
try {
emit(1)
emit(2)
println("This line will not execute") // 这行不会执行
emit(3)
} finally {
println("Finally in numbers") // 取消时会触发
}
}

fun main() = runBlocking {
numbers().take(2).collect { println(it) }
}
  • 虽然 flow 块中写了三个 emit,但 take(2) 在拿到前两个后就通过抛出异常(内部取消)的方式结束了流。

3. 开发者感悟

take 在处理无限流或大数据流时非常有用。例如:监听传感器数据,但只要前 10 条结果就结束。它能确保协程被及时取消,不会浪费 CPU 资源。

,