gpt4 book ai didi

android - 如何使用switchIfEmpty?

转载 作者:行者123 更新时间:2023-11-29 19:10:30 27 4
gpt4 key购买 nike

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

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

当第一部分返回空结果时,它到达第二部分。 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));

关于android - 如何使用switchIfEmpty?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45549827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com