Rx java RxJava3:去抖动/跳过不需要的';0';在整数流中,但需要';0';只有不断地

Rx java RxJava3:去抖动/跳过不需要的';0';在整数流中,但需要';0';只有不断地,rx-java,reactive-programming,Rx Java,Reactive Programming,我有一个整数类型的观测值,它发出0和正数,还有一个观测值来捕捉两者 Observable每10毫秒发出连续的零或连续的正数(一次一项) 如0,0,0,0,0,0,0,5,6,7,8,8,9,10,11,4,5,6,5,0,0,0,0…[预计] 而且它在正数之间发射零(很少) 像0,0,0,0,0,0,5,5,6,7,8,8,**0**,9,10,11,4,5,6,5,0,0,0,0…[意外] 我想去抖动/跳过这个介于两个正数之间的零,但如果它是连续的,我有兴趣捕捉到0 在rxjava中是否有任何

我有一个整数类型的观测值,它发出0和正数,还有一个观测值来捕捉两者

Observable每10毫秒发出连续的零或连续的正数(一次一项)

0,0,0,0,0,0,0,5,6,7,8,8,9,10,11,4,5,6,5,0,0,0,0…
[预计]

而且它在正数之间发射零(很少)

0,0,0,0,0,0,5,5,6,7,8,8,**0**,9,10,11,4,5,6,5,0,0,0,0…
[意外]

我想去抖动/跳过这个介于两个正数之间的零,但如果它是连续的,我有兴趣捕捉到0

在rxjava中是否有任何操作符组合来实现这一点。提前谢谢

代码如下所示:

public Observer<Integer> valueObserver = new DisposingObserver<Integer>() {
        @Override
        public void onNext(Integer value) {
         //every 10 seconds a value is received
         //do action based on zero or non-zero values.
        }
    };

Observable<Integer> sourceObservable = Observable.just(0,0,0,0,0,0,0,5,5,6,7,8,8,0,9,10,11,4,5,6,5,0,0,0,0,0,...);
sourceObservable.subscribe(valueObserver);
public Observer valueObserver=new DisposingObserver(){
@凌驾
public void onNext(整数值){
//每10秒接收一个值
//根据零值或非零值执行操作。
}
};
Observable sourceObservable=可观察的。刚好(0,0,0,0,0,5,5,6,7,8,8,0,9,10,11,4,5,6,5,0,0,0,…);
sourceObservable.subscribe(valueObserver);
预期o/p:0,5,6,7,8,9,10,11,4,5,6,5,0


使用distinctUntilChanged运算符可以消除连续的重复元素。

这需要记住流到目前为止已经生成了多少个后续零,并且什么也不发出,一个零、两个零或非零项。您可以使用
flatMapIterable
执行此操作,但计数零是有状态的,因此需要
defer

静态可观测转换器skipSingleZero(){
返回源->可观察。延迟(()->{
AtomicInteger Zerossen=新的AtomicInteger();
返回源
.FlatMapiteTable(项目->{
如果(项==0){
int n=zerossen.getAndIncrement();
//我们看到的第一个零,不要发射它
如果(n==0){
返回集合。emptyList();
}
//一行中的第二个零表示条纹,因此同时发射两个
如果(n==1){
返回数组.asList(0,0);
}
//第三个或更多的零,现在就发射
返回集合。singletonList(0);
}
//非零项,重置计数器
零集(0);
返回集合。单件列表(项目);
});
});
}

这是一个中间有一个零的序列,所以应该跳过:

Observable source=Observable.fromArray(
0, 0, 0, 0, 0, 0, 0, 5, 5, 6, 7, 8, 8,
0, 9, 10, 11, 4, 5, 6, 5, 0, 0, 0, 0, 0
);
来源
.compose(skipSingleZero())
.test()
.资产结果(
0, 0, 0, 0, 0, 0, 0, 5, 5, 6, 7, 8, 8,
9, 10, 11, 4, 5, 6, 5, 0, 0, 0, 0, 0
);

这中间有2条条纹,应该保存:

Observable<Integer> source = Observable.fromArray(
        0, 0, 0, 0, 0, 0, 0, 5, 5, 6, 7, 8, 8,
        0, 0, 9, 10, 11, 4, 5, 6, 5, 0, 0, 0, 0, 0
);

中间的零是一个0序列,或者你只得到一个?最好添加有效输入和输出的示例。请包括每个项目的时间和值。@在更新之间只有一个0,是否还需要删除重复项?@akarnokd谢谢。这是解决我问题的完美办法。工作完美!!!