我正在使用两个具有扁平数据结构的存储库,例如。 " MenuItemRepo"和" IngredientRepo"。它们之间的关系结构是:一个MenuItem可以包含许多成分,并且单个成分(例如Cheese)可以是许多MenuItem的一部分。数据库表的建模如下:
MenuItem表条目
MenuItem-Ingredient参考表条目
成分表条目
我是否可以使用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,这是结构平坦的原因之一。
答案 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))