flatMap和map还是有共同点的,都是将一个对象转换为另一个对象,不同的是map只是一对一的转换,而flatMap可以是一对多的转换
http://www.jianshu.com/p/b39afa92807e
http://www.jianshu.com/p/5e93c9101dc5
http://blog.csdn.net/job_hesc/article/details/46495281
http://gank.io/post/560e15be2dca930e00da1083
1、flatMap
ArrayList list=new ArrayList<>();
String[] words1={"Hello,","I am","China!"};
String[] words2={"Hello,","I am","Beijing!"};
list.add(words1);
list.add(words2);
Observable.fromIterable(list)
.flatMap(new Function>() {
@Override
public ObservableSource apply(@NonNull String[] strings) throws Exception {
return Observable.fromArray(strings);
}
})
.subscribe(new Observer() {
private int i;
private Disposable mDisposable;
@Override
public void onSubscribe(@NonNull Disposable d) {
mDisposable = d;
}
@Override
public void onNext(@NonNull String s) {
Log.e("---->", s);
i++;
if (i == 2) {
// 在RxJava 2.x 中,新增的Disposable可以做到切断的操作,让Observer观察者不再接收上游事件
mDisposable.dispose();
}
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
2、map
Observable.just("Hello,I am China!")
// just,就是一个简单的发射器依次调用 onNext() 方法。
//这个第一个泛型为接收参数的数据类型,第二个泛型为转换后要发射的数据类型
.map(new Function() {
@Override
public String apply(@NonNull String s) throws Exception {
return s + "Hello world";
}
})
.subscribe(new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
Log.e("---->", s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
3、zip
zip 专用于合并事件,该合并不是连接(连接操作符后面会说),而是两两配对,也就意味着,最终配对出的 Observable 发射事件数目只和少的那个相同。
Observable.zip(getStringObservable(), getIntegerObservable(), new BiFunction() {
@Override
public String apply(@NonNull String s, @NonNull Integer integer) throws Exception {
return null;
}
}).subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
Log.e(TAG, "zip : accept : " + s + "\n");
}
});
private Observable getStringObservable() {
return Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
if (!e.isDisposed()) {
e.onNext("A");
Log.e(TAG, "String emit : A \n");
e.onNext("B");
Log.e(TAG, "String emit : B \n");
e.onNext("C");
Log.e(TAG, "String emit : C \n");
}
}
});
}
private Observable getIntegerObservable() {
return Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
if (!e.isDisposed()) {
e.onNext(1);
Log.e(TAG, "Integer emit : 1 \n");
e.onNext(2);
Log.e(TAG, "Integer emit : 2 \n");
e.onNext(3);
Log.e(TAG, "Integer emit : 3 \n");
e.onNext(4);
Log.e(TAG, "Integer emit : 4 \n");
e.onNext(5);
Log.e(TAG, "Integer emit : 5 \n");
}
}
});
}
4、基本用法
//创建被观察者
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
});
//创建观察者
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("---->", "subscribe");
Log.e("---->", Thread.currentThread().getName());
Log.e("---->", "d");
}
@Override
public void onNext(final Integer value) {
Log.e("---->", "" + value);
Log.e("---->", Thread.currentThread().getName());
textView.setText(value + "");
}
@Override
public void onError(Throwable e) {
Log.e("---->", "error");
}
@Override
public void onComplete() {
Log.e("---->", "complete");
}
};
//订阅
observable.observeOn(AndroidSchedulers.mainThread())// 指定 Subscriber 的回调发生在主线程
.subscribeOn(Schedulers.io())// 指定 subscribe() 发生在 IO 线程
.subscribe(observer);
5、Concat
Observable.concat(Observable.just(1, 2, 4), Observable.just("r", "a", "C", "das"))
.subscribe(new Consumer() {
@Override
public void accept(Serializable serializable) throws Exception {
Log.e("--->", serializable.toString());
}
});
7、from操作符对id数组进行循环,然后把每个id作为参数再去请求内容,再调用toList把循环请求下来的内容生成一个List。
8、switchMap操作符
switchMap操作符与flatMap操作符类似,都是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。