先用人话理解
Flow 表示异步发出的多个值。collect 收集这些值,map 转换每个值,filter 只让符合条件的值通过。Flow 通常是冷流,开始收集后才执行上游代码。
本课要点:Flow 管道可以组合 map、filter 等操作符。真实搜索还要考虑 debounce、取消旧请求和生命周期。
代码例子
先读注释,再关注每一行如何把数据变成结果。
KOTLIN/JVM · 需要协程依赖
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun searchHints(query: String): Flow<List<String>> = flow {
delay(250) // 模拟一点等待;真实搜索可以使用 debounce
val all = listOf("Kotlin", "Compose", "Coroutine", "Flow")
emit(all.filter { it.contains(query, ignoreCase = true) })
}
fun main() = runBlocking {
searchHints("co").collect { hints -> println(hints) }
}再看一个用法
KOTLIN/JVM · 需要协程依赖
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val words = flowOf("apple", "banana", "apricot")
words.filter { it.startsWith("a") }
.collect { println(it) } // 尝试把条件改成 it.startsWith("b")
}动手改一改
先运行当前示例,再把查询词 co 改成 flo,观察结果怎样变化。第二个例子可以把筛选条件从以 a 开头改成以 b 开头。
运行要求:Flow 示例需要 kotlinx-coroutines-core 依赖。在 Kotlin/JVM 项目中添加 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0");Android 项目可使用 kotlinx-coroutines-android。依赖版本请与项目的 Kotlin 版本核对。
查看 Flow 官方文档 ↗三道小测
先自己选择,再展开答案。答错也没关系,重要的是知道为什么。
1. Flow 的 collect 用来做什么?
查看答案与解析
正确答案:A。回到概念和代码示例,再解释一次为什么。
2. filter 的作用是什么?
查看答案与解析
正确答案:B。抓住题目中的核心概念,重新对照示例理解。
3. 冷 Flow 通常何时开始执行?
查看答案与解析
正确答案:B。抓住题目中的核心概念,重新对照示例理解。
深入阅读
想继续往下挖,可以阅读 Kotlin / Android 官方文档。
打开官方文档 ↗标记学习进度
进度保存在当前浏览器的 localStorage 中。