探索Kotlin流的力量:合并,合并和拉链流
这是异步流量系列的一部分:
我在这里有2个流。
Flow1从 1-> 1000 每个 1秒。
private val flow1: Flow<Int> = flow {
repeat(10000) { value ->
delay(1000)
Log.d(tag, "[Flow1]: emitting $value")
emit(value)
}
}
流2将char
从 a到z 每个 2秒。
private val flow2: Flow<Char> = flow {
var value = 'A'
while(true) {
delay(2000)
Log.d(tag, "[Flow2]: emitting $value")
emit(value)
if (value == 'Z') {
value = 'A'
} else {
value += 1
}
}
}
结合流程
使用Flow.combine()
extension function流动器。
val combineFlow = flow1.combine(flow2) { flow1Value,flow2Value ->
"${flow1Value}_${flow2Value}"
}
此Flow.combine()
扩展功能的限制是仅限于2个流量。要结合2个以上的流,您可以直接使用combine()
功能,该功能最多支持5个流。
val combineFlow = combine(flow1, flow2) { flow1Value, flow2Value ->
"${flow1Value}_${flow2Value}"
}
要收集流量,我将LaunchedEffect()副作用用于此演示目的。推荐的方法是使用collectAsStateWithLifeCylce()
or repeatOnLifecycle(Lifecycle.State.STARTED)
,请参见here。
LaunchedEffect(true) {
viewModel.combineFlow.collect { value ->
Log.d(tag, "[Combine Flow]: $value")
}
}
所以这是输出。 结合了 最新值 flow1 和 flow2 。
。
合并流
此合并 flow1 和 flow2 合并,
val mergeFlow = merge(flow1, flow2)
这是输出:
1
和A
同时发射,然后是2
,然后是3
和B
等。
拉链流
此zips flow1 和 flow2 进入 zipflow,
val zipFlow = flow1.zip(flow2) { flow1value,flow2value ->
"${flow1value}_${flow2value}"
}
这是输出:
您可以从此输出中看到, zip将数据配对从 flow1 和 flow2 。
。
结论
上图有助于我了解组合,合并和拉链流操作员之间的差异。
我一直在此项目here中使用combine()
,该项目将房间数据库(文章)的流与来自原始数据存储(用户设置)的另一个流程结合在一起。我没有机会使用Merge()
和Zip()
。 :)
源代码
github存储库:Demo_AsyncFlow(请参阅CombineMergeZipFlowActivity
)
最初出版于https://vtsen.hashnode.dev 。