【问题标题】:rxjava2 - how to zip Maybe that can be empty?rxjava2 - 如何压缩也许可以是空的?
【发布时间】:2017-06-08 16:34:34
【问题描述】:

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

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

有关简化示例,请参见下文:

@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 操作?如果这是解决此问题的错误模式,您建议如何解决?

【问题讨论】:

  • 使用defaultIfEmpty 给出一个默认值,并在 zip 函数中注意。
  • 谢谢@akarnokd。使用defaultIfEmpty 有效。
  • 为了支持流结果的optional性质,我决定使用Maybe&lt;Optional&lt;Integer&gt;&gt; empty = Maybe.just(Optional.empty());,它也可以。

标签: rx-java2


【解决方案1】:

对于大多数用例,利用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 "";
    }
} 

【讨论】:

  • 如果您不想允许空的 Maybe,请考虑使用 Single&lt;Optional&lt;T&gt;&gt;
  • 似乎很难将 Optional 与 Maybe 一起使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多