gpt4 book ai didi

rx-java - Rx立即反弹

转载 作者:行者123 更新时间:2023-12-03 20:17:45 25 4
gpt4 key购买 nike

我正在寻找运算符(operator)debounce一系列事件,让我们说用户的点击。输入和输出应如下所示:

interval :      ->     <-            ->     <-
in : 1--2--3-------4--5--5--6-7-8--------
out : 1-------------4---------------------

这个想法就像使用 immediate选项 on http://underscorejs.org/#debounce的下划线的反跳一样。可以使用支持响应式扩展的任何语言来显示/实现运算符(operator)

编辑:澄清间隔,说5秒(两个箭头之间的5个空格): -> <-
Edit2:一个更易于理解的版本:我有一个用户,他反复单击一个按钮(1、2、3);我想捕获第一个 click(1),而忽略其余的。过了一会儿,他累了,休息了7秒钟(比两个箭头之间的5秒钟间隔还长),然后再次单击该按钮(4、5、6、7、8)。我想捕获第一个 click( 4)忽略其余部分。

如果他在第四箭头之后单击,我也想捕获那个点击。

Edit3:这是一个图像 image,可以在 original article上找到

最佳答案

编辑:根据说明,RxJava没有这种类型的流的运算符,但是它可以由一组非平凡的其他运算符组成:

import java.util.concurrent.TimeUnit;

import rx.Observable;

public class DebounceFirst {

public static void main(String[] args) {
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("T=" + v))
.compose(debounceFirst(500, TimeUnit.MILLISECONDS))
.toBlocking()
.subscribe(v -> System.out.println("Debounced: " + v));
}

static <T> Observable.Transformer<T, T> debounceFirst(long timeout, TimeUnit unit) {
return f ->
f.publish(g ->
g.take(1)
.concatWith(
g.switchMap(u -> Observable.timer(timeout, unit).map(w -> u))
.take(1)
.ignoreElements()
)
.repeatWhen(h -> h.takeUntil(g.ignoreElements()))
);
}
}

关于rx-java - Rx立即反弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41964731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com