Когда вы используете map vs flatMap в RxJava?
Скажем, например, мы хотим отобразить файлы, содержащие JSON, в строки, содержащие JSON -
Используя карту, мы должны как-то разобраться с Исключением. Но как?:
Observable.from(jsonFile).map(new Func1<File, String>() {
@Override public String call(File file) {
try {
return new Gson().toJson(new FileReader(file), Object.class);
} catch (FileNotFoundException e) {
// So Exception. What to do ?
}
return null; // Not good :(
}
});
Используя flatMap, он гораздо более подробный, но мы можем перенаправить проблему по цепочке Observables и обработать ошибку, если мы выберем где-то еще и даже повторим:
Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
@Override public Observable<String> call(final File file) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override public void call(Subscriber<? super String> subscriber) {
try {
String json = new Gson().toJson(new FileReader(file), Object.class);
subscriber.onNext(json);
subscriber.onCompleted();
} catch (FileNotFoundException e) {
subscriber.onError(e);
}
}
});
}
});
Мне нравится простота карты, но обработка ошибок плоской карты (а не многословие). Я не видел никаких лучших практик в этом плавании, и мне любопытно, как это используется на практике.