使用带有可能不会发出值的Maybe的zip()

use*_*815 3 android observable rx-java2

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

遵循我的代码(剥离到基本部分):

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();
}
Run Code Online (Sandbox Code Playgroud)

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

GVi*_*i82 8

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

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

现在您zip将永远"完成",但您可以使用以下方法检索您的真实数据:

id.getValue()
Run Code Online (Sandbox Code Playgroud)

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

  • 非常好,这比将所有对象显式包装在 `Optional&lt;T&gt;` 中或创建“空”实例进行比较要干净得多,这是我见过的其他两种解决此问题的解决方案。感觉有点冗长,你必须在每个输入流上调用 `toObservable().materialize()`,但我想如果你在很多地方都这样做,你可以编写自己的 `zipAlways(Maybe, Maybe, NullableParamFunction)`。 (2认同)
  • 我收到一条警告,说“materialize”被标记为不稳定。 (2认同)