Android 我是否可以获取项目列表并基于id获取唯一列表,并将两个列表合并为一个可流动列表?

Android 我是否可以获取项目列表并基于id获取唯一列表,并将两个列表合并为一个可流动列表?,android,rx-java,rx-android,rx-java2,Android,Rx Java,Rx Android,Rx Java2,我从数据库中获取ShoppingList项目列表 每个项目都有recipeId,例如,如果我有10个shoppinglist项目 其中8个可以有相同的recipeId,其余的shoppinglist项目可以有另一个recipeId。这意味着10个项目可以代表2个食谱。 所以我拿了10个购物清单上的商品,然后我有10个回执。我应该保留唯一的RecipeID在这种情况下,我们有2个RecipeID,然后获得该RecipeID的配方,注意:我需要显示10个购物清单项目和2个配方 我可以用Flowabl

我从数据库中获取ShoppingList项目列表 每个项目都有recipeId,例如,如果我有10个shoppinglist项目 其中8个可以有相同的recipeId,其余的shoppinglist项目可以有另一个recipeId。这意味着10个项目可以代表2个食谱。 所以我拿了10个购物清单上的商品,然后我有10个回执。我应该保留唯一的RecipeID在这种情况下,我们有2个RecipeID,然后获得该RecipeID的配方,注意:我需要显示10个购物清单项目和2个配方

我可以用Flowable获取所有这些信息吗, 或者我需要订阅shoppingListItems,然后根据此列表在单独的flowable中创建唯一RecipeID列表


如果可能的话,哪种解决方案是最好的

比方说,您有购物物品,并且希望获取每个独特的Receid信息:

环境::

rxjava2.0.7

assertJ 3.8.0

-

此代码将recepId和每个recepId的请求分组到recep中,并将结果连接回ShoppingItem

@Test
void name() {
    Observable<Tuple2<ShoppingListItem, Recep>> tuple = getFromDb().flatMapIterable(i -> i)
            .groupBy(shoppingListItem -> shoppingListItem.recepId)
            .flatMap(g -> {
                Observable<Recep> recep = getRecep(g.getKey());
                return Observable.combineLatest(recep, g, (recep1, shoppingListItem) -> {
                    return Tuple.of(shoppingListItem, recep1);
                });
            });
    TestObserver<Tuple2<ShoppingListItem, Recep>> test = tuple.test()
            .assertValueCount(4)
            .assertComplete()
            .assertNoErrors();

    List<Tuple2<ShoppingListItem, Recep>> values = test.values();

    assertThat(values).extracting("_1").extracting("recepId").contains(0, 1);
    assertThat(values).extracting("_1").extracting("id").containsExactly(0, 1, 2, 3);
    assertThat(values).extracting("_2").extracting("id").containsExactly(1, 1, 0, 0);
}

Observable<List<ShoppingListItem>> getFromDb() {
    List<ShoppingListItem> shoppingListItems = Arrays.asList(
            new ShoppingListItem(0, 1),
            new ShoppingListItem(1, 1),
            new ShoppingListItem(2, 0),
            new ShoppingListItem(3, 0)
    );

    return Observable.just(shoppingListItems);
}

Observable<Recep> getRecep(int id) {
    return Observable.just(new Recep(id));
}

class Recep {
    private final int id;

    public Recep(int id) {
        this.id = id;
    }
}

class ShoppingListItem {
    private final int id;

    private final int recepId;

    public ShoppingListItem(int id, int recepId) {
        this.id = id;
        this.recepId = recepId;
    }
}
返回分组对象中的ShoppingItems列表和Receps列表:

@Test
void name() {
    Observable<Items> itemsObservable = getFromDb().flatMapSingle(shoppingListItems -> {
        List<Integer> collect = shoppingListItems.stream().map(i -> i.recepId)
                .distinct()
                .collect(Collectors.toList());

        return Observable.fromIterable(collect).flatMap(this::getRecep)
                .toList()
                .zipWith(Single.just(collect), (receps, integers) -> {
                    return new Items(receps, shoppingListItems);
                });
    });

    TestObserver<Items> test = itemsObservable.test()
            .assertValueCount(1)
            .assertComplete()
            .assertNoErrors();

    Items items = test.values().get(0);

    assertThat(items.receps).hasSize(2);
    assertThat(items.shoppingListItems).hasSize(4);
}


Observable<List<ShoppingListItem>> getFromDb() {
    List<ShoppingListItem> shoppingListItems = Arrays.asList(
            new ShoppingListItem(0, 1),
            new ShoppingListItem(1, 1),
            new ShoppingListItem(2, 0),
            new ShoppingListItem(3, 0)
    );

    return Observable.just(shoppingListItems);
}

Observable<Recep> getRecep(int id) {
    return Observable.just(new Recep(id));
}

class Items {
    private final List<Recep> receps;
    private final List<ShoppingListItem> shoppingListItems;

    Items(List<Recep> receps, List<ShoppingListItem> shoppingListItems) {
        this.receps = receps;
        this.shoppingListItems = shoppingListItems;
    }
}

class Recep {
    private final int id;

    public Recep(int id) {
        this.id = id;
    }
}

class ShoppingListItem {
    private final int id;

    private final int recepId;

    public ShoppingListItem(int id, int recepId) {
        this.id = id;
        this.recepId = recepId;
    }
}

请提供您的数据结构类好吗?@Hans Wurst第一个表包含shoppinListId、productName、recipeId,第二个表包含recipeId、recipeName、Ingreements。为什么不通过两个以上的sql联接一次获取所有信息tables@Hans首先,我从DB获取购物清单,但我从服务器获取食谱谢谢你的帮助,但是我假设它返回了shoppinglist和recipe元组,虽然我需要10个shoppinglist项和2个唯一配方项,但我添加了另一个解决方案