有没有更好的方法可以使用RxJava获得两个观测值的交点

有没有更好的方法可以使用RxJava获得两个观测值的交点,java,rx-java,reactivex,Java,Rx Java,Reactivex,使用RxJava,我有一个源可观察对象,它发出许多项目,我希望这些项目与另一个发出相同类型的可观察对象相交。在研究了许多选项之后,似乎最连贯的组织方式是: Observable<String> source = ...emits 20 items Observable.create(subscriber -> { source .buffer(5) .subscribe(things -> { tochec

使用RxJava,我有一个源可观察对象,它发出许多项目,我希望这些项目与另一个发出相同类型的可观察对象相交。在研究了许多选项之后,似乎最连贯的组织方式是:

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));

我得到了20个“Processing”日志实例,奇怪的是,只有“Processing after”中的几行日志(我预计只有12行)。它似乎比它应该完成的时间更早。也许我的结构有问题?

所以看起来Androidx很合适。我使用的是Redis反应式API,它的行为看起来不太正常。上面添加的代码片段是构造两个观测值相交的正确方法。

我不完全理解
flatMap
如何在您的案例中完成流。问题可能出在
getMatches
实现中?你能给我看一些代码吗?如果我理解flatMap,它使用的是来自目标观测的onComplete。在本例中,getMatches在检查这5项上的匹配项时表示其已完成,因此只在3项而不是12项上完成流。我的理解有误吗?
flatMap
不应该从它的单个观察值传播
onComplete
,否则它作为一个操作符就没有意义了。因此,在我看来,可以做一些简单的事情:
source.buffer(5).flatMap(things->getMatches(things)).subscribe(/*对过滤结果做点什么*/)应该可以。运行了一些测试,我更新了帖子来解释我的结果。我正在尽最大努力将我的真实代码提取到这个示例代码中。我的用法有什么不对吗?从我看来,一切都很好。也许,一些奇怪的魔法正在
getMatches()
中发生?它不会抛出运行时异常吗?
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());
    });