考虑以下用例:
解除以下事件的影响
我最终实现了基于OperatorDebounceWithTime
的自定义操作符,然后像这样使用它
.lift(new CustomOperatorDebounceWithTime<>(1, TimeUnit.SECONDS, Schedulers.computation()))
CustomOperatorDebounceWithTime
立即交付第一个项目,然后使用OperatorDebounceWithTime
操作符的逻辑来去除后面的项目。
有没有更简单的方法来实现所描述的行为?让我们跳过compose
运算符,它不能解决问题。我正在寻找一种不实现自定义运算符的方法来实现这一点。
发布于 2015-05-10 06:42:43
更新:
从@lopar的评论来看,一个更好的方式是:
Observable.from(items).publish(publishedItems -> publishedItems.limit(1).concatWith(publishedItems.skip(1).debounce(1, TimeUnit.SECONDS)))
像这样的东西可以工作吗:
String[] items = {"one", "two", "three", "four", "five", "six", "seven", "eight"};
Observable<String> myObservable = Observable.from(items);
Observable.concat(myObservable.first(), myObservable.skip(1).debounce(1, TimeUnit.SECONDS))
.subscribe(s -> System.out.println(s));
发布于 2015-10-08 07:26:55
@LortRaydenMK和@lopar的答案是最好的,但我想建议一些其他的东西,以防它对你或遇到类似情况的人更有效。
有一个debounce()
的变体,它接受一个函数,该函数决定在多长时间内去掉这个特定的项。它通过返回一个在一段时间后完成的可观察对象来指定这一点。您的函数可以为第一项返回empty()
,为其余项返回timer()
。类似于(未测试的):
String[] items = {"one", "two", "three", "four", "five", "six"};
Observable.from(items)
.debounce(item -> item.equals("one")
? Observable.empty()
: Observable.timer(1, TimeUnit.SECONDS));
诀窍是这个函数必须知道哪一项是第一项。您的序列可能知道这一点。如果不是这样的话,你可能不得不用range()
或者别的什么东西来zip()
。在这种情况下,最好使用另一个答案中的解决方案。
发布于 2017-03-08 15:53:51
一个简单的解决方案是使用从the answer for the same question for RxJS转换而来的RxJava 2.0,它结合了throttleFirst和去反跳,然后删除重复项。
private <T> ObservableTransformer<T, T> debounceImmediate() {
return observable -> observable.publish(p ->
Observable.merge(p.throttleFirst(1, TimeUnit.SECONDS),
p.debounce(1, TimeUnit.SECONDS)).distinctUntilChanged());
}
@Test
public void testDebounceImmediate() {
Observable.just(0, 100, 200, 1500, 1600, 1800, 2000, 10000)
.flatMap(v -> Observable.timer(v, TimeUnit.MILLISECONDS).map(w -> v))
.doOnNext(v -> System.out.println(LocalDateTime.now() + " T=" + v))
.compose(debounceImmediate())
.blockingSubscribe(v -> System.out.println(LocalDateTime.now() + " Debounced: " + v));
}
使用limit()或take()的方法似乎不能处理长时间的数据流,在这种情况下,我可能希望继续观察,但仍然会立即对第一个事件采取行动。
https://stackoverflow.com/questions/30140044
复制相似问题