Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何创建检测另一个流的连续值增量的流?_Android_Kotlin_Kotlin Flow - Fatal编程技术网

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

Android 如何创建检测另一个流的连续值增量的流?,android,kotlin,kotlin-flow,Android,Kotlin,Kotlin Flow,我有一个发出整数值的热流fooFlow。当fooFlow发出的值大于fooFlow最近发出的值时,如何构造另一个仅发出值的热流barFlow?在某种意义上,barFlow检测fooFlow的连续值增加 示例:如果foodflow发出(4,2,7,3,3,1,2,4,…),那么barFlow发出(7,2,4,…)可能有一种更自然或更干净的方法来做这件事,但这是我的第一本能: val barFlow: SharedFlow<Int> = MutableSharedFlow<Int&

我有一个发出整数值的热流
fooFlow
。当
fooFlow
发出的值大于
fooFlow
最近发出的值时,如何构造另一个仅发出值的热流
barFlow
?在某种意义上,
barFlow
检测
fooFlow
的连续值增加


示例:如果
foodflow
发出(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)
}
val barFlow:SharedFlow=MutableSharedFlow()。同时{outflow->
var previousValue=Int.MAX\u值
foodflow.onEach{newValue->
如果(新值>上一个值){
流出.emit(newValue)
}
前一个值=新值
}.launchIn(viewModelScope)
}

也许有一种更自然或更干净的方法可以做到这一点,但这是我的第一直觉:

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)
}
val barFlow:SharedFlow=MutableSharedFlow()。同时{outflow->
var previousValue=Int.MAX\u值
foodflow.onEach{newValue->
如果(新值>上一个值){
流出.emit(newValue)
}
前一个值=新值
}.launchIn(viewModelScope)
}
这正是可以用来:

val barFlow = fooFlow.fold(Int.MIN_VALUE) { maxValue, newValue ->
  max(maxValue, newValue)
}
它允许您设置初始值(此处为
Int.MIN\u值
,以便每个值都大于该值),然后允许您访问以前的值(
maxValue
)和新值(
newValue
),允许您进行任何比较,并将该输出用作新发出的值。

这正是可用于:

val barFlow = fooFlow.fold(Int.MIN_VALUE) { maxValue, newValue ->
  max(maxValue, newValue)
}

它允许您设置初始值(此处,
Int.MIN\u value
,以便每个值都大于它),然后允许您访问以前的值(maxValue)和新值(newValue),允许您进行任何比较,并将该输出用作新发出的值。

如果我错了,请纠正我,但是,由于OP请求了一个热流,我认为您必须使用
stateIn
shareIn
调用将其标记为热流。@Tenfour04-
fold
不会将热流更改为冷流。当新的价值观出现时,它只是机械地改变流量。哦,没错。但它只会返回一个Int,并且只有在原始SharedFlow被取消时才会返回,对吗?您已将其分配给名为
barFlow
的局部变量。如果我错了,也请纠正我,但此流是否发出
fooFlow
的累积最大值?我更希望
foodflow
的值连续增加。我已经更新了OP以澄清这一点@Tenfour04如果我错了,请纠正我,但由于OP请求了一个热流,我认为您必须使用
stateIn
shareIn
调用来标记它以保持热流。@Tenfour04-
fold
不会将热流更改为冷流。当新的价值观出现时,它只是机械地改变流量。哦,没错。但它只会返回一个Int,并且只有在原始SharedFlow被取消时才会返回,对吗?您已将其分配给名为
barFlow
的局部变量。如果我错了,也请纠正我,但此流是否发出
fooFlow
的累积最大值?我更希望
foodflow
的值连续增加。我已经更新了OP以澄清这一点@Tenfour04I根据您更新的问题更新了我的答案。我根据您更新的问题更新了我的答案。