1.map
转换操作符
- Observable.create(new ObservableOnSubscribe<String>() {
- @Override
- public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
- emitter.onNext("apple");
- }
- }).map(new Function<String, Fruit>() {
- @Override
- public Fruit apply(@NonNull String name) throws Exception {
- Log.e("rxjava", "apply " + name);
- return new Fruit(name);
- }
- }).subscribe(new Observer<Fruit>() {
- @Override
- public void onSubscribe(@NonNull Disposable d) {
-
- }
-
- @Override
- public void onNext(@NonNull Fruit fruit) {
- Log.e("rxjava", "onNext " + fruit.toString());
- }
-
- @Override
- public void onError(@NonNull Throwable e) {
-
- }
-
- @Override
- public void onComplete() {
- Log.e("rxjava", "onComplete");
- }
- });
- 执行结果:
- rxjava: apply0 apple
- rxjava: apply1 apple_1
- rxjava: onNext Fruit{name='apple_1'}
map 返回的是一个 ObservableMap
所谓转换,就是通过applay函数,将传入的T类型,转换成R类型。map后面可以跟多个map,将apply产生的对象,继续向下传递。
上面的例子,就是将传入的字符串"apple" 通过map的apply转换函数,转换成Fruit对象,
传递给下游的被观察者。map可以把一串Json字符串,转换成一个list的集合对象。
2.flatMap
- Observable.create(new ObservableOnSubscribe<String>() {
- @Override
- public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
- for (int i = 0; i < 3; i++) {
- emitter.onNext(String.valueOf(i));
- }
- }
- }).flatMap(new Function<String, ObservableSource<String>>() {
- @Override
- public ObservableSource<String> apply(@NonNull String s) throws Exception {
- List<String> list = new ArrayList<>();
- list.add("apple" + s);
- return Observable.fromIterable(list);
- }
- }).map(new Function<String, Fruit>() {
- @Override
- public Fruit apply(@NonNull String name) throws Exception {
- Log.e("rxjava","apply "+name);
- return new Fruit(name);
- }
- }).subscribe(new Observer<Fruit>() {
- @Override
- public void onSubscribe(@NonNull Disposable d) {
-
- }
-
- @Override
- public void onNext(@NonNull Fruit fruit) {
- Log.e("rxjava","onNext "+fruit.toString());
- }
-
- @Override
- public void onError(@NonNull Throwable e) {
-
- }
-
- @Override
- public void onComplete() {
-
- }
- });
- 执行结果:
- rxjava: apply apple0
- rxjava: onNext Fruit{name='apple0'}
- rxjava: apply apple1
- rxjava: onNext Fruit{name='apple1'}
- rxjava: apply apple2
- rxjava: onNext Fruit{name='apple2'}
flatMap 返回的是 ObservableFlatMap
调用apply返回给下游的就是ObservableSource这样一个被观察者,而map执行apply是返回的转换后的对象,这个是map和flatMap最大的区别。
flatMap返回的是一个被观察者,下游可以跟一个被观察者也可以跟观察者。
3.concatMap
和flatMap差不多
- Observable.create(new ObservableOnSubscribe<String>() {
- @Override
- public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
- for (int i = 0; i < 3; i++) {
- emitter.onNext(String.valueOf(i));
- }
- }
- }).concatMap(new Function<String, ObservableSource<String>>() {
- @Override
- public ObservableSource<String> apply(@NonNull String s) throws Exception {
- List<String> list = new ArrayList<>();
- list.add("apple" + s);
- return Observable.fromIterable(list);
- }
- }).map(new Function<String, Fruit>() {
- @Override
- public Fruit apply(@NonNull String name) throws Exception {
- Log.e("rxjava","apply "+name);
- return new Fruit(name);
- }
- }).subscribe(new Observer<Fruit>() {
- @Override
- public void onSubscribe(@NonNull Disposable d) {
-
- }
-
- @Override
- public void onNext(@NonNull Fruit fruit) {
- Log.e("rxjava","onNext "+fruit.toString());
- }
-
- @Override
- public void onError(@NonNull Throwable e) {
-
- }
-
- @Override
- public void onComplete() {
-
- }
- });
- 执行结果:
- rxjava: apply apple0
- rxjava: onNext Fruit{name='apple0'}
- rxjava: apply apple1
- rxjava: onNext Fruit{name='apple1'}
- rxjava: apply apple2
- rxjava: onNext Fruit{name='apple2'}
concatMap返回的是ObservableConcatMap
apply返回的就是ObservableSource类型。