我有一个可观察到的值,然后完成。我想将它转换为一个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());
答案 0 :(得分:2)
只需使用flatMap()
返回调用Observables
或onError
的{{1}}即可完成同样的事情:
onCompleted
也就是说,我可能会重新考虑使用car.flatMap(c ->
c.gasLevel < 0.25 ? Observable.error(new Exception()) : Observable.empty();
);
进行流控制的设计,因为它会使流难以使用。这与使用try-catch for flow非常相似。