Rxjs 如果相同的发射发生在x毫秒前,则阻止发射

Rxjs 如果相同的发射发生在x毫秒前,则阻止发射,rxjs,rx-java,system.reactive,rx-android,Rxjs,Rx Java,System.reactive,Rx Android,我想防止发射发生,如果且仅当在最后x毫秒内发射了相同的确切项目。我已经看过油门和去盎司操作,但我不确定他们是否能帮我。是否还有其他运算符可以使用,或者我可以以某种方式组合它们?您可以为每个项目添加时间戳并配对,然后检查时间和相等的边界条件 randomSource .timestamp() .pairwise() .where(pair => pair[0].timestamp - pai

我想防止发射发生,如果且仅当在最后x毫秒内发射了相同的确切项目。我已经看过油门和去盎司操作,但我不确定他们是否能帮我。是否还有其他运算符可以使用,或者我可以以某种方式组合它们?

您可以为每个项目添加时间戳并配对,然后检查时间和相等的边界条件

   randomSource
                .timestamp()
                .pairwise()
                .where(pair => pair[0].timestamp - pair[1].timestamp < limit && pair[0].value === pair[1].value);
输出:

2@9/7/2017 5:00:04 AM +00:00 2@9/7/2017 5:00:04 AM +00:00
2@9/7/2017 5:00:09 AM +00:00 2@9/7/2017 5:00:08 AM +00:00
1@9/7/2017 5:00:23 AM +00:00 1@9/7/2017 5:00:23 AM +00:00
2@9/7/2017 5:00:33 AM +00:00 2@9/7/2017 5:00:32 AM +00:00

因为您的问题没有完全解释类似“将下一个发射值与上一个发射值或任何上一个发射值进行比较”之类的场景。 我会采取一种通用的方法来解决这个问题

示例在RxJava

您可以使用
timestamp()
filter()
运算符,如下所示:

ArrayList<String> list = new ArrayList<>();
        final long[] timeOfSubscribe = {-1};
        final long timeDuration = 2 * 1000; // 2 seconds
        Observable.fromIterable(list)
                .timestamp()
                .filter(item -> item.time() > (timeDuration + timeOfSubscribe[0]) && item.value().equals("your last value"))
                .doOnSubscribe(__ -> timeOfSubscribe[0] = Calendar.getInstance().getTimeInMillis())
                .subscribe();
ArrayList list=new ArrayList();
最终长[]时间订阅={-1};
最终长持续时间=2*1000;//2秒
可观察的。从可观察的(列表)
.时间戳()
.filter(item->item.time()>(timeDuration+timeOfSubscribe[0])&&item.value().equals(“您的上一个值”))
.doOnSubscribe(\uuu->timeOfSubscribe[0]=Calendar.getInstance().getTimeInMillis())
.subscribe();
我想这段代码可以帮助您只需要更改
filter()
操作符中的发出值比较登录名。如果要查找上次发出的值,可以使用
doOnNext()
运算符停止上次发出的值(使用简单的大小写),或者如果要查找所有上次发出的值,则需要将发出的值存储在列表中并进行检查


我希望它能有所帮助。

你可以使用groupByUntil来实现这一点,基本上消除单个项目的影响

o
  .groupByUntil(x => x, x => x, x => Observable.timer(1000))
  .flatMap(grp => grp.first())

你能提供更多的信息吗?例如,您正在处理哪些对象,项目的发射速度有多快?您从何处发射这些项目?对你来说重要的是这些项目是一个接一个地发出,还是可以成批发出?我就是这么做的。RxJS看起来不错——RxJava2似乎没有groupByUntil操作符,shot:)是的,我不确定你为什么同时列出RxJS和RxJava。您可以尝试将C#版本移植到Java:在毫秒的时间范围内,这不是非常高效的GC。@Asti在不知道吞吐量的情况下很难说。任何解决方案都需要分配“记住”元素,这些元素在出现之前和出现时都会出现,这意味着所有解决方案都会造成一定的GC压力
o
  .groupByUntil(x => x, x => x, x => Observable.timer(1000))
  .flatMap(grp => grp.first())