如何创建一个流来检测另一个流的连续值增量?

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),允许您进行任何比较并将该输出用作新发出的值。