前言:
1、学习这两个操作符之前,请确保你读过这篇文章:RxJava2 转换操作符之FlatMap()方法,或者已经充分了解FlatMap()。
2、因为这两个操作符,跟FlatMap只有一点不同,所以,将它们独立的,合并在一篇中。
一、ContactMap操作符
ContactMap是用来解决FlatMap操作符,在转换数据的过程,会出现任务交叉的问题。如果,你对数据转换的过程,要求严格的按顺序执行。即执行完一个任务后,再执行另一个任务。那么,就用ContactMap替代FlatMap。用法一模一样,就换个名字而已。
ContactMap操作符流程图
代码示例:
public static void actionFlatMap() {
List<Integer> list = Arrays.asList(1, 2, 3);
// 这里用了lambda。
Observable.fromIterable(list)
.concatMap(integer -> {
log("开始执行,第" + integer + "圆球的任务" + getThreadName());
return getObservable(integer);
}).subscribe(s -> log("已完成" + s + getThreadName()));
}
public static Observable<String> getObservable(final int integer) {
return Observable.create((ObservableOnSubscribe<String>) emitter -> {
emitter.onNext("第" + integer + "圆球的第1个棱形任务");
if(integer != 1) {
// 第2和第3个圆球的第二个任务延时。
Thread.sleep(5 * 1000);
}
emitter.onNext("第" + integer + "圆球的第2个棱形任务");
emitter.onComplete();
}).subscribeOn(Schedulers.newThread());
}
// 返回当前的线程名
public static String getThreadName() {
return " | ThreadName=" + Thread.currentThread().getName();
}
private static void log(String log) {
Log.d("FlatMap", log);
}
二、flatMapIterable操作符
flatMapIterable操作与flatMap,在流程上,大体都相同。唯一不同的是,flatMap是转一个Observable 转换成多个Observables。每一个Observable,最后又得返回一个Observable。而flatMapIterable在将一个Observable转换成多个Observables后,每一个Observable,只能返回一个Iterable。而不是另一个Observable。。。 Iterable,可以理解成返回一个list。
先上图,再上码:
flatMapIterable操作符流程图
代码示例:
public static void actionFlatMapIterable() {
List<Integer> list = Arrays.asList(1, 2, 3);
Observable.fromIterable(list)
.flatMapIterable(new Function<Integer, Iterable<String>>() {
@Override
public Iterable<String> apply(Integer integer) throws Exception {
return Arrays.asList(String.valueOf("a"+integer), String.valueOf("b"+integer), String.valueOf("c"+integer));
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
log("accept="+s);
}
});
}
这是输出:
D/TransformingOperations: accept=a1
D/TransformingOperations: accept=b1
D/TransformingOperations: accept=c1
D/TransformingOperations: accept=a2
D/TransformingOperations: accept=b2
D/TransformingOperations: accept=c2
D/TransformingOperations: accept=a3
D/TransformingOperations: accept=b3
D/TransformingOperations: accept=c3
以上是两个操作符的简介和示例代码,这两个比较简单,就不赘述了。下一篇是讲解:SwitchMap()操作符。
老套路,附上可以跑的代码(0 warnings, 0 errors):
https://github.com/SuperBeagleDog/OkMVP
注意:
这个库里面有很多东西,RxJava2的转换操作符部分的demo位于:com.lyf.okmvp.demo.rxjava2包下的TransformingOperations类里面。
用法:
1、直接在com.lyf.okmvp.ui包下的MainActivity类里的onCreate()方法里面,直接调用:
TransformingOperations.actionContactMap(); // 静态方法。
TransformingOperations.actionFlatMapIterable(); // 静态方法。
2、也可以复制TransformingOperations类到你的项目里,去为所欲为。但前提时,你得有配置过RxJava和RxAndroid。配置方法,自行百度,或参考我的OkMVP库。