你什么时候在RxJava中使用map vs 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 :(
}
});
Run Code Online (Sandbox Code Playgroud)
使用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();
} …Run Code Online (Sandbox Code Playgroud) 这里有类似的问题,但它们附加到特定的编程语言,我正在寻找概念层面的答案.
据我所知,Functors本质上是不可变的容器,它暴露了map() API,派生出另一个仿函数.哪个添加可以将特定的仿函数称为monad?
据我所知,每个monad都是一个仿函数,但不是每个仿函数都是monad.
双方map并flatMap都defind上ImplicitlyUnwrappedOptional,但他们根据不同的文件(显然)在他们的定义:
func map(f:@noescape(T) - > U) - > U!
如果self == nil,则返回nil.否则,返回f(self!).
func flatMap(f:@noescape(T) - > U!) - > U!
返回f(自我)!iff self和f(self)不是nil.
我尝试使用它们的一个简单示例:
let number: Int? = 1
let res1 = number.map { $0 + 1 }.map { $0 + 1 }
let res2 = number.flatMap { $0 + 1 }.flatMap { $0 + 1 }
res1 //3
res2 //3
Run Code Online (Sandbox Code Playgroud)
但是,他们生产的相同的结果,即使number是nil.
我的问题是,它们之间有什么实际的区别,如果我申请map或flatMap到ImplicitlyUnwrappedOptionalS' 我应该选择哪一个以及何时?