Rx java 如何过滤超过增量阈值的值

Rx java 如何过滤超过增量阈值的值,rx-java,rx-java2,Rx Java,Rx Java2,我有一个可以观察到的数字(整数,双精度,BigDecimal实际上并不重要)。我有一个在可观测合成时间定义的阈值。换句话说,在可观察的生命周期内,阈值不会改变 我需要的是过滤掉阈值内与上次传递的值不同的值。或者重新表述:仅当值与上次传递的值的差异大于阈值时,才向下游传递值 下面的例子可以更好地解释这一点: Source observable values: [5, 4, 7, 9, 15, 14, 13, 12, 11, 7, 3, 2, 1] Filetered values with t

我有一个可以观察到的数字(整数,双精度,BigDecimal实际上并不重要)。我有一个在可观测合成时间定义的阈值。换句话说,在可观察的生命周期内,阈值不会改变

我需要的是过滤掉阈值内与上次传递的值不同的值。或者重新表述:仅当值与上次传递的值的差异大于阈值时,才向下游传递值

下面的例子可以更好地解释这一点:

Source observable values: 
[5, 4, 7, 9, 15, 14, 13, 12, 11, 7, 3, 2, 1]

Filetered values with threshold = 3 : 
[5, 9, 15, 11, 7, 3]
为了更好地说明它,让我们假设它是温度读数,例如。我只想过滤那些温度变化超过3度的值。第一个值始终传递并用作比较的初始值。例如,如果第一个温度读数为21摄氏度,并且在一小时内每个后续读数都在[18..24]内,则这些值都不应通过下游。但一旦超过这些界限,它就应该通过并创建新的界限来进行比较


问题是:如何仅使用RxJava操作符实现这一点?或者除了在rx管道外存储状态之外,没有其他方法(在易失性或原子引用或任何其他同步状态下,细节无关紧要)

您可以使用
扫描
distinctUntilChanged
的组合来实现这一点,只需rx操作员即可

scan
允许您访问上一个和下一个值,允许您与给定阈值进行比较

如果未达到阈值,则可以仅发射上一个值

distinctUntilChanged
可用于减少重复排放

在Kotlin中,如下所示:

val threshold = 3
val list = listOf(5, 4, 7, 9, 15, 14, 13, 12, 11, 7, 3, 2, 1)

return Observable.fromIterable<Int>(list)
        .scan { previous: Int, next: Int ->
            val difference = abs(next - previous)
            when {
                difference > threshold -> next
                else -> previous
            }
        }.distinctUntilChanged()
val阈值=3
val list=listOf(5,4,7,9,15,14,13,12,11,7,3,2,1)
返回可观察的。来自可观察的(列表)
.scan{previous:Int,next:Int->
val差值=绝对值(下一个-上一个)
什么时候{
差异>阈值->下一步
else->previous
}
}.distinctUntilChanged()

非常感谢您!!!这正是我想要的。非常简洁易读的解决方案。