当前位置: 首页 > 知识库问答 >
问题:

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

汪欣德
2023-03-14

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

这里的预期输出是,当我订阅结果的可观察时,我会发出12个项目。由于getMatches的契约,我需要缓冲结果。

从表面上看,这似乎是可行的,但它似乎不是最干净的方式。过滤器似乎不适用于此,因为出于性能原因,我无法对每个项目运行相交检查。我尝试使用平面图,但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());
    });

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

共有1个答案

闾丘鸣
2023-03-14

所以看起来Androidx是正确的。我使用的是Redis莴苣反应API,它的行为看起来不太正常。上面添加的代码片段是构造两个可观察对象相交的正确方法。

 类似资料:
  • 问题内容: 我目前正在使用以下功能比较字典值。有更快或更更好的方法吗? 编辑:两个字典包含相同的键。 问题答案: 如果字典具有相同的键集,并且您需要所有这些打印件以实现任何值差异,那么您将无能为力。也许像这样: 几乎等同于您所拥有的,但是您可能会得到更好的演示,例如在循环使用diffkey之前对其进行排序。

  • 问题内容: 在Python中,我已经看到使用此语法交换了两个变量值: 这是否被认为是交换两个变量值的标准方法,还是有其他一些习惯上最常用的交换两个变量的方法? 问题答案: Python从左到右计算表达式。请注意,在评估分配时,右侧的评估先于左侧。 http://docs.python.org/3/reference/expressions.html#evaluation-order 这意味着该表达

  • 我正在使用Appium Java客户端为Sam's Club Android应用程序编写自动化。 在项目详细信息屏幕上,有一个价格字段。我正在尝试获得价格价值。问题是没有该要素的案文。 我查看了页面源并搜索了一下,看看是否有一个价格值在任何地方--但它似乎不存在于页面源的任何地方。 它的效果很好,我可以通过这种方式获得价值,但感觉我在这里做了一些矫枉过正。有更好的方法吗?

  • 问题内容: 是否有一个很好的方法来Map 获取和忽略案件? 问题答案: TreeMap扩展了Map并支持自定义比较器。 字符串提供默认的不区分大小写的比较器。 所以: 比较器不考虑区域设置。在其JavaDoc中阅读有关它的更多信息。

  • 我试图让我的UI显示两个按钮,其中一个稍微重叠在另一个,在一个全幅卡的中间。因为堆栈的宽度只能与其未定位的子级相同,所以我添加了一个宽度为double.infinity的SizedBox的未定位子级,以便给我一个画布来放置按钮,但我不知道该放什么作为SizedBox的高度。理想情况下,无论用户是在手机上还是在平板电脑上,我都希望这个小部件能够适当地调整自己的大小,所以我宁愿将SizedBox的高度

  • 问题内容: 在过滤掉冗余信息时,我需要组合两个字符串集,这是我想出的解决方案,有没有人可以建议的更好方法?也许我忽略了内置的东西?谷歌没有任何运气。 问题答案: 由于a 不包含重复的条目,因此可以通过以下方式将两者合并: 两次添加都没有关系,该集合只包含一次元素…例如,不需要使用method 进行检查。