变换型操作符
map
操作符
// 上游
Observable.just(1) // 发射 1
// 在上游和下游之间 变换
.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
// 1
Log.d(TAG, "map1 apply: " + integer);
return "【" + integer + "】";
}
})
.map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String s) throws Exception {
// s == 【" + integer + "】
Log.d(TAG, "map2 apply: " + s);
return Bitmap.createBitmap(1920, 1280, Bitmap.Config.ARGB_8888);
// return null; // 如果返回null,下游无法接收
}
})
// 订阅
.subscribe(
// 下游
new Observer<Bitmap>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Bitmap string) {
Log.d(TAG, "下游 onNext: " + string);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
输入是Integer
类型通过map
的变换,变成String
类型,然后再变换成Bitmap
类型,下游最终接收的是Bitmap
类型。
map
操作符是一个比较"单一"的操作符(这个是和flatMap
进行对比),从Integer
-> String
-> Bitmap
,都是一个类型转换位另外一个类型,类似一对一的情况,flatMap
是变换为一个用ObservableSource
包裹的类型。
flatMap
操作符
// 上游
Observable.just(1111)
// 变换操作符
.flatMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(final Integer integer) throws Exception {
// integer == 111
// ObservableSource == 可以再次手动发送事件
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext(integer + "flatMap变换操作符");
e.onNext(integer + "flatMap变换操作符");
e.onNext(integer + "flatMap变换操作符");
}
});
}
})
// 订阅
.subscribe(
// 下游
new Consumer<String>() {
@Override
public void accept(String string) throws Exception {
Log.d(TAG, "下游接收 变换操作符 发射的事件 accept: " + string);
}
});
上游输入一个Integer
类型,通过flatMap
变换,最终下游接收的是三个String
类型,这类似一对多的关系,通常用在上游是List
集合类型,通过flatMap
遍历Item
给下游接收。
有一点需要注意的是flatMap
操作符是无序的,不按顺序发射。
// 上游
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("步惊云"); // String
e.onNext("雄霸");
e.onNext("李四");
e.onComplete();
}
})
.flatMap(new Function<String, ObservableSource<?>>() { // ? 通配符 默认Object
@Override
public ObservableSource<?> apply(String s) throws Exception {
List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add(s + " 下标:" + (1 + i));
}
return Observable.fromIterable(list).delay(5, TimeUnit.SECONDS); // 创建型操作符,创建被观察者
}
})
// 订阅
.subscribe(
new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
//顺序可能会打乱
Log.d(TAG, "下游 onNext: " + o);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
concatMap
操作符
concatMap
和flatMap
总体差不多,唯一区别就是concatMap
操作符是有序的。
// 上游
Observable.just("A", "B", "C")
// 变换操作符
.concatMap(new Function<String, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(String s) throws Exception {
List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add(s + " 下标:" + (1 + i));
}
return Observable.fromIterable(list).delay(5, TimeUnit.SECONDS); // 创建型操作符,创建被观察者
}
})
.subscribe(new Consumer<Object>() { // 下游
@Override
public void accept(Object s) throws Exception {
Log.d(TAG, "accept: " + s);
}
});