什么时候在RxJava中使用map与flatMap
例如,我们希望将包含JSON的文件映射到包含JSON的字符串--
使用map,我们必须以某种方式处理Exception。但是如何做到呢?:
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);
}
}
});
}
});我喜欢map的简单性,但喜欢flatmap的错误处理(而不是冗长)。我还没有看到任何关于这方面的最佳实践,我很好奇这是如何在实践中使用的。
发布于 2017-07-07 01:29:07
这是一个简单的经验法则,我用它来帮助我决定在Rx的Observable中何时使用flatMap()而不是map()。
一旦您决定要使用map转换,您就会编写转换代码来返回某个对象,对吧?
如果您作为转换的最终结果返回的内容是:
map(). map()将该对象包装在一个可观察的对象中,并发出it.Observable flatMap().对象,然后您将使用map()然后flatMap()打开可观察对象,选择返回的对象,用它自己的可观察对象包装它,然后发出它。例如,我们有一个方法titleCase(String inputParam),它返回输入参数的大小写字符串对象。此方法的返回类型可以是String或Observable<String>。
如果titleCase(..)的返回类型仅仅是String,那么你应该使用map(s -> titleCase(s))
String的返回类型是Observable<String>,那么你应该使用flatMap(s -> titleCase(s))希望能澄清这一点。
https://stackoverflow.com/questions/22847105
复制相似问题