android - 什么是 RxJava 等同于 orElse

标签 android rx-java

在其他语言的流/函数领域有一个常见的操作,那就是 orElse()。它的作用类似于 if,当当前链没有得到任何结果时,它会更改为备用链。在具有 Maybe 类型的语言中,它基本上会继续 Some 类型的链或更改为 None 类型的 orElse。

理想情况:

Observable.just(false)
          .filter(value -> { return value; })
          .map(value -> { return 1; })
          .orElse(Observable.just(0));

Observable.<Boolean>error(new IllegalStateException("Just playing"))
          .filter(value -> { return value; })
          .map(value -> { return 1; })
          .orElse(Observable.just(0));

目前可以使用 concat 和 takeFirst 重现它,但它在语义上并不相同,并且没有正确处理错误。

Observable.concat(Observable.just(false)
                            .filter(value -> { return value; })
                            .map(value -> { return 1; }), 
                  Observable.just(0))
          .takeFirst();

最佳答案

看起来他们有,但命名不同:defaultIfEmpty或 switchIfEmpty。

Observable.just(false)
        .filter(value -> value)
        .map(value -> 1)
        .defaultIfEmpty(0)
        .subscribe(val -> {
            // val == 0
        });

Observable.just(false)
        .filter(value -> value)
        .map(value -> 1)
        .switchIfEmpty(Observable.just(0))
        .subscribe(val -> {
            // val == 0
        });

// Error thrown from the first observable
Observable.<Boolean>error(new IllegalStateException("Crash!"))
        .filter(value -> value)
        .map(value -> 1)
        .switchIfEmpty(Observable.<Integer>error(new IllegalStateException("Boom!")))
        .subscribe(val -> {
            // never reached
        }, error -> {
            // error.getMessage() == "Crash!"
        });

// Error thrown from the second observable
Observable.just(false)
        .filter(value -> value)
        .map(value -> 1)
        .switchIfEmpty(Observable.<Integer>error(new IllegalStateException("Boom!")))
        .subscribe(val -> {
            // never reached
        }, error -> {
            // error.getMessage() == "Boom!"
        });

关于android - 什么是 RxJava 等同于 orElse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32833705/

相关文章:

android - 两个表之间的公共(public)列

javascript - 强制 Chrome (38) 退出全屏模式

android - 更改 AutoCompleteTextView 下划线颜色

java - 异常 : wrong final block length. ..aes 解密

reactive-programming - RxJava- 何时不使用 Observable?

java - 使用 Fallback Observable x 次

android - 使用 Xamarin 创建 Android 蓝牙终端连接到 HC-06 模块

java - RxJava : PublishSubject acts synchronously

java - 如何在准备就绪时使用响应式(Reactive) Flux/Mono 将消息推送到上游,而不是间隔轮询状态?

android - 对 retrofit 电话作出 react