[英]concat in RxJava2 and first() function
我正在将我的存储库模式迁移到RxJava2。 我的旧代码看起来像
@Override
public Observable<List<Post>> getPost() {
return Observable.concat(mAppLocalDataStore.getPost(), mAppRemoteDataStore.getPost())
.first(new Func1<List<Post>, Boolean>() {
@Override
public Boolean call(List<Post> posts) {
return posts != null;
}
});
}
但是,我不知道如何在RxJava2中替换它,如何用我当前的代码调用posts.upToDate()?
@Override
public Observable<List<Post>> getPost() {
List<Post> list = new ArrayList<>();
return Observable.concat(mAppLocalDataStore.getPost(), mAppRemoteDataStore.getPost())
.first(list)
.toObservable();
}
谢谢@PhoenixWang的提示。 这是解决方案。
@Override
public Observable<List<Post>> getPost() {
return Observable.concat(mAppLocalDataStore.getPost(), mAppRemoteDataStore.getPost())
.filter(new Predicate<List<Post>>() {
@Override
public boolean test(@NonNull List<Post> posts) throws Exception {
return isUpToDate(posts);
}
});
}
你想打到本地商店,如果本地商店什么也没有,你只试试远程商店? 我使用firstElement-operator来实现加载第一个,如果不可用则使用第二个源。 我建议在观察者和错误处理上放置一个超时。 如果第一个出现错误,则不会调用第二个。 无需检查null,因为不允许使用空值。
让我们看看第一个测试'name':两个observables生成每个List。 just1首先生成值,因此将使用它,将丢弃just2中的值。
@Test
public void name() throws Exception {
Observable<List<Integer>> just1 = Observable.just(Arrays.asList(1, 2, 3));
Observable<List<Integer>> just2 = Observable.just(Arrays.asList(1, 2, 3));
TestObserver<List<Integer>> await = Observable.concat(just1, just2)
.firstElement().test().await();
List<Integer> collect = await.values().stream()
.flatMap(Collection::stream).collect(Collectors.toList());
assertThat(collect).contains(1, 2, 3);
}
Test-2将通过第二个值,因为just1只是在没有值的情况下完成。
@Test
public void name2() throws Exception {
Observable<List<Integer>> just1 = Observable.empty();
Observable<List<Integer>> just2 = Observable.just(Arrays.asList(1, 2, 3));
TestObserver<List<Integer>> await = Observable.concat(just1, just2)
.firstElement().test().await();
List<Integer> collect = await.values().stream()
.flatMap(Collection::stream).collect(Collectors.toList());
assertThat(collect).contains(1, 2, 3);
}
Test-3不会发出任何值。 在订阅'Maybe'时,您将收到一个onComplete。
@Test
public void name3() throws Exception {
Observable<List<Integer>> just1 = Observable.empty();
Observable<List<Integer>> just2 = Observable.empty();
TestObserver<List<Integer>> await = Observable.concat(just1, just2)
.firstElement()
.test()
.await()
.assertNoValues();
}
测试4不会发出任何值,因为在observables上传递onError。
@Test
public void name4() throws Exception {
Observable<List<Integer>> just1 = Observable.empty();
Observable<List<Integer>> just2 = Observable.error(NoSuchElementException::new);
TestObserver<List<Integer>> await = Observable.concat(just1, just2)
.firstElement()
.test()
.await()
.assertNoValues()
.assertError(NoSuchElementException.class);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.