使用RxJava,我有一个源Observable,它发出许多项目,我希望与另一个发出相同类型的Observable相交。在完成了许多选项之后,看起来构建事物最连贯的方式就是这样:
Observable<String> source = ...emits 20 items
Observable.create(subscriber -> {
source
.buffer(5)
.subscribe(things -> {
tocheck.getMatches(things) //emits 3 matches
.subscribe(subscriber::onNext, subscriber::onError, () -> {});
}, subscriber::onError, subscriber::onCompleted));
这里的预期输出是当我订阅生成的Observable时,我会发出12个项目。由于getMatches的约定,我要求缓冲结果。
在它的脸上,这似乎会起作用,但它似乎不是最干净的方式。过滤器似乎不适用于此处,因为出于性能原因,我无法对每个项目运行交叉检查。我玩弄了flatMap,但getMatches observable完成了流而不是来自source observable的完成通知。
有没有更好的方法来构建它?
编辑: 为了澄清这种代码风格发生了什么:
Observable<String> source = ...emits 20 items
source
.buffer(5)
.flatMap(this::getMatches); //final observable would emit a total of 12 items
这显然更清晰,但是当我添加一些日志记录时(假设数据大小与原始代码段相同:
source
.doOnEach(notification -> {
log.trace("Processing {}", notification.getValue());
})
.buffer(5)
.flatMap(this::getMatches)
.doOnEach(notification -> {
log.trace("Processing after match {}", notification.getValue());
});
我得到20个“处理”日志的实例,然后奇怪地只有“处理后”的几个日志行(当我预期12时)。它似乎比应该更早地调用完成。也许我正在构建错误的东西?
答案 0 :(得分:1)
所以它看起来像AndroidEx一样。我使用的是Redis Lettuce反应性API,它看起来并没有表现得恰到好处。上面添加的代码片段是构造两个Observable的交集的正确方法。