我使用的是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)
我会去学习。谢谢你的帮助!
答案 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
运算符,可能在您的用例中效果更好