繁体   English   中英

在RxJava2和first()函数中连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM