簡體   English   中英

具有去抖動的RxJava2緩沖區

[英]RxJava2 buffer with debounce

我想緩沖元素並在沒有x元素時間的新元素時將它們作為集合發出。 怎么做?

例如給定輸入

INPUT    TIME
1        0  
2        0
3        100
4        150
5        400
6        450
7        800   

如果我的x = 200,我想發出{1, 2, 3, 4}, {5, 6}, {7}

我嘗試的是簡單的buffer()隨着時間的推移,但它沒有提供去抖動。 我也在源上嘗試了throttleFirst()buffer().take(1) throttleFirst()上嘗試了flatMap() buffer().take(1)flatMap源上buffer().take(1) ,它的工作方式類似,但並不完全符合要求。

您需要publish因為您需要相同的源來通過去抖動來控制緩沖行為:

static <T> ObservableTransformer<T, List<T>> bufferDebounce(
        long time, TimeUnit unit, Scheduler scheduler) {
    return o ->
        o.publish(v -> 
            v.buffer(v.debounce(time, unit, scheduler)
                .takeUntil(v.ignoreElements().toObservable())
            )
        );
}

@Test
public void test() {
    PublishSubject<Integer> ps = PublishSubject.create();

    TestScheduler sch = new TestScheduler();

    ps.compose(bufferDebounce(200, TimeUnit.MILLISECONDS, sch))
    .subscribe(
            v -> System.out.println(sch.now(TimeUnit.MILLISECONDS)+ ": " + v),
            Throwable::printStackTrace,
            () -> System.out.println("Done"));

    ps.onNext(1);
    ps.onNext(2);

    sch.advanceTimeTo(100, TimeUnit.MILLISECONDS);

    ps.onNext(3);

    sch.advanceTimeTo(150, TimeUnit.MILLISECONDS);

    ps.onNext(4);

    sch.advanceTimeTo(400, TimeUnit.MILLISECONDS);

    ps.onNext(5);

    sch.advanceTimeTo(450, TimeUnit.MILLISECONDS);

    ps.onNext(6);

    sch.advanceTimeTo(800, TimeUnit.MILLISECONDS);

    ps.onNext(7);
    ps.onComplete();

    sch.advanceTimeTo(850, TimeUnit.MILLISECONDS);
}

takeUntil用於防止o完成觸發空緩沖區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM