如何在onComplete上刷新Rx缓冲区?

时间:2016-12-22 01:57:21

标签: rx-java reactive-programming

我使用的是RxJava,但也许可以从其他实现中翻译答案。

我有一个Observable发出一系列项目,我想把它们分成10组。这样的东西:

observable
    .buffer(10)
    .map(items -> {
        StringBuilder sb = new StringBuilder();
        for (String item : items)
            sb.append(item.document);
        return sb.toString();
    })
    .subscribe(...)

效果很好。但我需要能够冲洗不完整的缓冲区。现在,如果我的观察结果在仅发出9个字符串后完成,我的订阅者将永远不会被调用。

有没有办法使用内置运算符执行此操作,或者我是否必须创建自定义观察器以在查看onComplete时执行缓冲?

谢谢!

更新:经过进一步调查后,问题变成了上游,我在那里有一些定制的可观测量,在测试中运行良好,但在连接时断开了。我本质上是这样做的:

Observable.never()
   .mergeWith(Observable.range(1,8))
   .buffer(5)

我还没有理解为什么,但never()阻止了部分批次的处理。然而,这很有效:

Observable.empty()
   .mergeWith(Observable.range(1,8))
   .buffer(5)

我会去学习。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我不知道你为什么不从缓冲区发出最后的项目。 缓冲区将发出一组项目,但它将发出所有项目。

检查此示例

@Test
public void stringBuffer() {
    Integer[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    Observable.from(numbers)
            .map(number -> "uniqueKey=" + number )
            .buffer(5)
            .map(ns -> String.join("&", ns))
            .subscribe(System.out::println);

}

即使最后一个数字10是该组中的唯一元素,它也会被发出。

您可以在此处查看更多缓冲区示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/transforming/ObservableBuffer.java

另请查看Window运算符,可能在您的用例中效果更好

https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/transforming/ObservableWindow.java