流/函数式语言中有一个常见的操作,即orelse()。它的作用类似于if,当当前链没有得到任何结果时,它将更改为备用链。在一种可能有类型的语言中,它基本上会继续某个类型的链,或者在一个无类型上更改为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!"
        });

07-27 16:45