代码示例
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flatMapConcat
fun main() = runBlocking<Unit> {
val outerFlow: Flow<Int> = flow {
emit(1)
emit(2)
emit(3)
}
val resultFlow: Flow<String> = outerFlow.flatMapConcat { value ->
flow {
emit("$value - A")
emit("$value - B")
}
}
resultFlow.collect {
println(it)
}
}
代码逻辑解释
- 定义
outerFlow
:
- 使用
flow
构建器创建一个Flow
,它会依次发射1
、2
、3
。这个Flow
代表外层的数据流。
- **使用
flatMapConcat
转换`:
outerFlow.flatMapConcat
操作符会遍历outerFlow
发射的每个元素。
- 对于
outerFlow
发射的每个元素value
,会创建一个新的Flow
,这里新的Flow
会发射"$value - A"
和"$value - B"
。
flatMapConcat
操作符会按顺序合并这些新创建的Flow
。也就是说,只有当前一个新创建的Flow
完成发射后,才会处理下一个新创建的Flow
。
- 收集结果:
- 使用
collect
函数收集resultFlow
发射的所有元素,并打印出来。这样就实现了将outerFlow
中的每个元素转换为另一个Flow
,并按顺序合并它们的功能。