有没有更好的方法来使用RxJava获取两个Observable的交集

时间:2016-01-23 20:50:23

标签: java rx-java reactivex

使用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时)。它似乎比应该更早地调用完成。也许我正在构建错误的东西?

1 个答案:

答案 0 :(得分:1)

所以它看起来像AndroidEx一样。我使用的是Redis Lettuce反应性API,它看起来并没有表现得恰到好处。上面添加的代码片段是构造两个Observable的交集的正确方法。