去抖后如何获得所有发射

时间:2019-07-08 13:50:56

标签: rx-java rx-java2

我有一个Observable链,可以成组地发射数据。

例如

1-2-3-4-5 ----------- 1-2-3-5-6 ------------ 5-3-2- 1-9 ------....

每个数字都是一个数字,我需要以下内容:

[1,2,3,4,5] ---------- [1,2,3,5,6] --------- [5,3,2 ,1,9] ----....

因此在这种情况下,不是发出15个整数。 我将获得3个整数数组的发射。

连接的发射之间的差异通常小于100毫秒,不同组之间的差异通常大于几分钟。 所以我考虑将Debounce进行某种组合,然后进行扫描以将发射转换为Array,但是我没有找到对我有用的东西。

是否有一些漂亮的RxJava2运算符可帮我解决这个问题?

我已经完成以下

        List<IncomeMessage> messages = new ArrayList<>();
        incomeMessageSubject.doOnNext(messages::add)
                .debounce(1000, TimeUnit.MILLISECONDS)
                .map(incomeMessage -> {
                    List<IncomeMessage> tempMessages = new ArrayList<>(messages);
                    messages.clear();
                    return tempMessages;
                })
                .subscribe();

但是我想知道是否有作为操作员内置的解决方案,并且不需要我需要手动管理的列表。

1 个答案:

答案 0 :(得分:0)

没有内置的运算符,您的解决方案可能会损坏列表,因为doOnNext和map可能会由于反跳而同时运行。

您可以使用由相同的去抖动源触发的边界缓冲区:

incomeMessageSubject
.buffer(incomingMessageSubject.debounce(1000, TimeUnit.MILLISECONDS))
.subscribe(/* consume list */);

如果您的来源很冷,则必须使用publish()

source
.publish(shared -> shared.buffer(shared.debounce(1, SECONDS)))
.subscribe(/* consume list */);