我有一个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();
但是我想知道是否有作为操作员内置的解决方案,并且不需要我需要手动管理的列表。
答案 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 */);