如何创建一个流来检测另一个流的连续值增量?
How to create a flow which detects consecutive value increments of another flow?
我有一个发出整数值的热流 fooFlow
。我如何构建另一个热流 barFlow
,仅当 fooFlow
发出的值大于 fooFlow
发出的最新值时才发出值?在某种意义上,barFlow
检测到 fooFlow
.
的连续值增加
示例: 如果 fooFlow
发出 (4, 2, 7, 3, 3, 1, 2, 4, ...),则 barFlow
发出 (7, 2, 4, ...).
可能有更自然或看起来更简洁的方法来执行此操作,但这是我的第一直觉:
val barFlow: SharedFlow<Int> = MutableSharedFlow<Int>().also { outflow ->
var previousValue = Int.MAX_VALUE
fooFlow.onEach { newValue ->
if (newValue > previousValue) {
outflow.emit(newValue)
}
previousValue = newValue
}.launchIn(viewModelScope)
}
这正是 fold()
的用途:
val barFlow = fooFlow.fold(Int.MIN_VALUE) { maxValue, newValue ->
max(maxValue, newValue)
}
它让你设置一个初始值(这里,Int.MIN_VALUE
,这样每个值都大于它),然后让你访问以前的值(maxValue
)和新值(newValue
),允许您进行任何比较并将该输出用作新发出的值。
我有一个发出整数值的热流 fooFlow
。我如何构建另一个热流 barFlow
,仅当 fooFlow
发出的值大于 fooFlow
发出的最新值时才发出值?在某种意义上,barFlow
检测到 fooFlow
.
示例: 如果 fooFlow
发出 (4, 2, 7, 3, 3, 1, 2, 4, ...),则 barFlow
发出 (7, 2, 4, ...).
可能有更自然或看起来更简洁的方法来执行此操作,但这是我的第一直觉:
val barFlow: SharedFlow<Int> = MutableSharedFlow<Int>().also { outflow ->
var previousValue = Int.MAX_VALUE
fooFlow.onEach { newValue ->
if (newValue > previousValue) {
outflow.emit(newValue)
}
previousValue = newValue
}.launchIn(viewModelScope)
}
这正是 fold()
的用途:
val barFlow = fooFlow.fold(Int.MIN_VALUE) { maxValue, newValue ->
max(maxValue, newValue)
}
它让你设置一个初始值(这里,Int.MIN_VALUE
,这样每个值都大于它),然后让你访问以前的值(maxValue
)和新值(newValue
),允许您进行任何比较并将该输出用作新发出的值。