【问题标题】:Using zip() with a Maybe that may not emit a value将 zip() 与可能不会发出值的 Maybe 一起使用
【发布时间】:2017-07-20 13:50:03
【问题描述】:

我试图一次执行两个Maybe,并在两者都完成后调用一个特定的方法。如果两个 Observable 都返回一个值,但在某些情况下可能不会发出一个项目,因此只调用 doOnComplete 而不是 doOnSuccess,则此方法有效。因此,如果其中一个 Maybes 没有调用 doOnSuccess,则不会执行 zip() 块。我想知道如何处理这种情况?

按照我的代码(精简到基本部分):

private void fetchData(){
    Maybe<Integer> maybeOne = getId(); // may return Maybe.empty()
    Maybe<List<String>> maybeTwo = getList();
    Maybe.zip(maybeOne, maybeTwo, (id, list) -> {
        initView(id, list); // only called if values have been emitted
        return true;
    }).subscribe();
}

我希望总是调用 zip() 块,但如果 Maybe 没有调用 onSuccess,则使用 null 值。不是这样的,我可以处理这种情况吗?

【问题讨论】:

    标签: android observable rx-java2


    【解决方案1】:

    您可以使用materialize 运算符。它基本上将串行调用转换为对象(包装在 Notification 对象中)。

    Observable.zip(maybeOne.toObservable().materialize(),
                    maybeTwo.toObservable().materialize(), (id, list) -> {
                        Log.d(TAG, "zip completed");
                        return true;
                    }).subscribe();
    

    现在您的zip 将始终“完成”,但您的真实数据可以通过以下方式检索:

    id.getValue()
    

    如果你的可能是Maybe.empty(),那么它不会返回值,而是返回null。

    【讨论】:

    • 太好了,这感觉比在Optional&lt;T&gt; 中显式包装所有对象或创建“空”实例进行比较要干净得多,这是我为这个问题看到的另外两个解决方案。你必须在每个输入流上调用toObservable().materialize() 感觉有点冗长,但我想如果你在很多地方都这样做,你可以编写自己的zipAlways(Maybe, Maybe, NullableParamFunction)
    • 我收到一条警告说materialize 被标记为不稳定。
    猜你喜欢
    • 1970-01-01
    • 2016-11-17
    • 2020-11-16
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多