rxjava2 - 如何压缩也许这可能是空的?

时间:2017-06-08 16:34:34

标签: rx-java2

我正在尝试拨打3个网络服务电话(例如:getPhoneNumbergetFirstNamegetLastName)并将答案收集到公共对象Person中。任何Web服务调用都可以返回Maybe.empty()

一起尝试zip响应时,rxjava2会跳过zip操作并正常终止(没有汇总我的回答)。

有关简化示例,请参阅以下内容:

@Test
public void maybeZipEmptyTest() throws Exception {
    Maybe<Integer> a = Maybe.just(1);
    Maybe<Integer> b = Maybe.just(2);
    Maybe<Integer> empty = Maybe.empty();

    TestObserver<String> observer = Maybe.zip(a,  b, empty, (x, y, e) -> {
        String output = "test: a "+x+" b "+y+" empty "+e;
        return output;
    })
    .doOnSuccess(output -> {
        System.out.println(output);
    })
    .test();

    observer.assertNoErrors();
}

我们如何在zip操作中收集空值而不是跳过/忽略zip操作?如果这是解决此问题的错误模式,您会如何建议解决此问题?

1 个答案:

答案 0 :(得分:2)

对于大多数用例,利用defaultIfEmpty方法是正确的方法。

为了表示最终可选的内容(甚至不使用默认值),我使用Java 8 Optional类型来表示。

例如

@Test
public void maybeZipEmptyTest() throws Exception {
    Maybe<Optional<Integer>> a = Maybe.just(Optional.of(1));
    Maybe<Optional<Integer>> b = Maybe.just(Optional.of(2));
    Maybe<Optional<Integer>> empty = Maybe.just(Optional.empty());

    TestObserver<String> observer = Maybe.zip(a,  b, empty, (x, y, e) -> {
        String output = "test: a "+toStringOrEmpty(x)+" b "+toStringOrEmpty(y)+" empty "+toStringOrEmpty(e);
        return output;
    })
    .doOnSuccess(output -> {
        System.out.println(output);
    })
    .test();

    observer.assertNoErrors();
}

private String toStringOrEmpty(Optional<Integer> value){
    if(value.isPresent()){
        return value.get().toString();
    }
    else { 
        return "";
    }
}