如何使用另一个流的元素属性作为条件使用RxJava过滤一个可观察流?

时间:2018-01-19 22:43:01

标签: java rx-java rx-android

我正在使用两个具有扁平数据结构的存储库,例如。 " MenuItemRepo"和" IngredientRepo"。它们之间的关系结构是:一个MenuItem可以包含许多成分,并且单个成分(例如Cheese)可以是许多MenuItem的一部分。数据库表的建模如下:

  • MenuItem表条目

    • string MenuItem-id
    • 字符串名称......
  • MenuItem-Ingredient参考表条目

    • string MenuItem-id
    • string Ingredient-id
  • 成分表条目

    • string Ingredient-id
    • bool isGlutenFree ...

我是否可以使用RxJava仅从[MenuItem stream]中选择MenuItem元素,其MenuItem ids与[MenuItem-Ingredient参考流]中的特定成分ID匹配?

我使用.filter()运算符在一个Flowable流中选择基于其自身属性的元素(例如,获取所有不含麸质的成分):

mIngredientsRepo.getItems()
                .flatMap(Flowable::fromIterable)
                .filter(ingredient-> ingredient.isGlutenFree)
                .toList() ....

这是为了获得所有glutenFree成分的清单。但是在这种情况下,MenuItem流不会存储成分ID。基本上我想看看是否可以使用类似SQL的JOIN过滤,以及它是否会在RxJava中保持优雅。

目前,我已使用SQLite连接语句在存储库级别实现。我想在RxJava中探索更直观和可维护的选项。

PS:此数据结构既用于本地又用于远程,也用于Firebase,这是结构平坦的原因之一。

1 个答案:

答案 0 :(得分:1)

您可以collect()将这些成分ID添加到HashSet,然后在menuitem流中,使用filter()contains检查:

mIngredientsRepo.getItems()
.flatMapIterable(v -> v)
.collect(HashSet::new, (a, b) -> a.add(b.id))
.flatMapPublisher(set -> menuitems.filter(mi -> set.contains(mi.id))