如何使用switchIfEmpty?

How to use switchIfEmpty?

我需要从数据库中获取数据。如果为空,则从服务器获取数据并将其插入数据库。 这是我的代码,

public Flowable<List<Data>> test() {
    return dataDao.allDatas()
           .switchIfEmpty(datas())
                .doOnNext(datas -> userStoreDao.insert(datas))
           );
}

public Flowable<List<Data>> datas() {
    return Flowable.zip(userFavoriteDatas(), userOtherDatas(),
        (favoriteDatas, otherDatas) -> {
            favoriteDatas.addAll(otherDatas);
            return favoriteDatas;
        });
}

public Flowable<List<Data>> userFavoriteDatas() {
    return userDatas()
        .map(UserDatas::favoriteDatas)
        .flatMapIterable(datas-> datas)
        .map(aLong -> new UserData(aLong, 1))
        .toList()
        .toFlowable();
}

public Flowable<List<Data>> userOtherDatas() {
    return userDatas()
        .map(UserDatas::otherDatas)
        .flatMapIterable(datas-> datas)
        .map(aLong -> new UserData(aLong, 1))
        .toList()
        .toFlowable();
}

private Flowable<Datas> userDatas() {
    return api
        .userDatas()
        .toFlowable()
        .share(); 
}

@GET("user/datas")
Single<Datas> datas();

当第一部分returns为空结果时到达第二部分。 datas() 直到最后才到达,而我 运行 只有第二部分它起作用但与 switchIfEmpty() 结合它到达 userDatas() 并且没有完成

我也试了concat(),结果一样。

(来自评论):

如果您使用 toList,则需要有限流。根据 OP 的反馈,allDatas 源是无限的,但返回了一个空的 List。解决方案是至少应用 take(1) 以从 allDatas 获得恰好一个响应,并且 然后选择性地过滤掉空的 List 以便 switchIfEmpty 可以切换到替代方案:

return allDatas.take(1).filter(list -> !list.isEmpty())
       .switchIfEmpty(datas())
       .doOnNext(datas -> userStoreDao.insert(datas));