RxJava - 将可观察值映射为错误

时间:2016-03-15 20:30:00

标签: rx-java

我有一个可观察到的值,然后完成。我想将它转换为一个observable,它可以成功完成,也可以根据原始observable中发出的值来失败。

我可以使用materialize / dematerialize完成此操作,但这很详细。有没有更好的方法来写这个?

Observable<Car> car = loadCar();

Observable<Double> failsIfNoGas = car.materialize()
        .map(new Func1<Notification<Car>, Notification<Double>>() {
            @Override
            public Notification<Double> call(Notification<Car> notif) {
                if (notif.isOnNext()) {
                    Car car = notif.getValue();
                    if (car.gasLevel < 0.25) {
                        return Notification.createOnError(new Exception());
                    } else {
                        return Notification.createOnCompleted();
                    }
                } else if (notif.isOnCompleted()) {
                    return Notification.createOnCompleted();
                } else {
                    return Notification.createOnError(notif.getThrowable());
                }
            }
         })
         .dematerialize();

Observable<Double> takeEmployeeToLunchAndGetPrice = 
        Observable.concat(failsIfNoGas, driveEmployeeToLunch());

1 个答案:

答案 0 :(得分:2)

只需使用flatMap()返回调用ObservablesonError的{​​{1}}即可完成同样的事情:

onCompleted

也就是说,我可能会重新考虑使用car.flatMap(c -> c.gasLevel < 0.25 ? Observable.error(new Exception()) : Observable.empty(); ); 进行流控制的设计,因为它会使流难以使用。这与使用try-catch for flow非常相似。