【问题标题】:Switch observable if it is empty如果为空则切换可观察对象
【发布时间】:2016-05-31 12:37:07
【问题描述】:

我实现了两个存储库来管理我的数据。因此,如果数据库中没有数据,它应该向 API 询问它。我在其他帖子中看到这可以使用 switchIfEmpty 解决,但它对我不起作用。

我尝试了以下代码。 restApiFlavorRepository.query(specification) 行被调用,但从未通知订阅者。

public Observable query(Specification specification) {

    final Observable observable = flavorDaoRepository.query(specification);

    return observable.map(new Func1() {
        @Override
        public Observable<List<Flavor>> call(Object o) {
            if(((ArrayList<Flavor>)o).isEmpty()) {
                return restApiFlavorRepository.query(specification);
            }
            return null;
        }
    });

}

还有这个

public Observable query(Specification specification) {

    final Observable observable = flavorDaoRepository.query(specification);

    return observable.switchIfEmpty(restApiFlavorRepository.query(specification));

}

当我应该获得两种口味时,我仍然得到空列表。

更新

我要找的,是这个……

public Observable query(Specification specification) {

    Observable<List<Plant>> query = mRepositories.get(0).query(specification);

    List<Plant> list = new ArrayList<>();
    query.subscribe(plants -> list.addAll(plants));

    Observable<List<Plant>> observable = Observable.just(list);

    return observable.map(v -> !v.isEmpty()).firstOrDefault(false)
            .flatMap(exists -> exists
                    ? observable
                    : mRepositories.get(1).query(null));
}

它就像魅力一样! :)

【问题讨论】:

  • flavorDaoRepository.query 是真的发出一个空列表还是刚刚完成?
  • 发出一个空列表。
  • 我会问@akarnokd 的答案是否正确,因为这是找到我的解决方案的途径。谢谢!

标签: java realm rx-java


【解决方案1】:

switchIfEmpty() 要求源在没有任何值的情况下完成才能切换到第二个源:

Observable.empty().switchIfEmpty(Observable.just(1))
.subscribe(System.out::println);

这个不会切换:

Observable.just(new ArrayList<Integer>())
.switchIfEmpty(Observable.just(Arrays.asList(2)))
.subscribe(System.out::println);

如果你想开启一个“自定义”的空虚概念,你可以使用filter

Observable.just(new ArrayList<Integer>())
.filter(v -> !v.isEmpty())
.switchIfEmpty(Observable.just(Arrays.asList(2)))
.subscribe(System.out::println);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多