如果它是空的,则切换observable

Ign*_*nte 5 java realm rx-java

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

我尝试了以下代码.调用行restApiFlavorRepository.query(规范),但永远不会通知订阅者.

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;
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

还有这个

public Observable query(Specification specification) {

    final Observable observable = flavorDaoRepository.query(specification);

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

}
Run Code Online (Sandbox Code Playgroud)

当我获得两种口味时,我仍然会得到空列表.

更新

我在找什么,是这个......

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));
}
Run Code Online (Sandbox Code Playgroud)

它就像魅力一样!:)

aka*_*okd 21

switchIfEmpty()要求源没有任何值,以切换到第二源来完成:

Observable.empty().switchIfEmpty(Observable.just(1))
.subscribe(System.out::println);
Run Code Online (Sandbox Code Playgroud)

这个不会切换:

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

如果要打开"自定义"空虚概念,可以使用filter:

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