簡體   English   中英

如何使用RxJava使用另一個流的element屬性作為條件來過濾一個可觀察的流?

[英]How to filter one observable stream using another stream's element attribute as criteria using RxJava?

我正在使用兩個具有扁平數據結構的存儲庫,例如。 “ MenuItemRepo”和“ IngredientRepo”。 它們之間的關系結構是:一個MenuItem可以包含許多配料,而單個Ingredient(例如奶酪)可以成為許多MenuItem的一部分。 數據庫表的建模如下:

  • MenuItem表條目

    • 字符串MenuItem-id
    • 字符串名稱...
  • MenuItem-成分參考表條目

    • 字符串MenuItem-id
    • 字符串成分編號
  • 成分表輸​​入

    • 字符串成分編號
    • bool isGlutenFree ...

我可以使用RxJava從[MenuItem流]中選擇MenuItem元素,這些菜單項的ID與[MenuItem-Ingredient參考流]中的特定成分ID匹配嗎?

我使用.filter()運算符在一個Flowable流中基於其自身的屬性選擇元素(例如,獲取所有不含麩質的成分):

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

這是獲得所有無麩質成分的列表。 但是在這種情況下,MenuItem流不存儲成分ID。 本質上,我想看看是否可以進行類似SQL的JOIN過濾,以及使用RxJava是否可以保持這種效果。

目前,我已經在存儲庫級別使用SQLite連接語句實現了。 我想探索RxJava中更直觀,更可維護的選項。

PS:此數據結構用於本地和遠程,也用於Firebase,這就是結構平坦的原因之一。

您可以collect()這些成分ID collect()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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM