• RxJava(二)-转换操作符


    1.map
      转换操作符

    1. Observable.create(new ObservableOnSubscribe<String>() {
    2. @Override
    3. public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
    4. emitter.onNext("apple");
    5. }
    6. }).map(new Function<String, Fruit>() {
    7. @Override
    8. public Fruit apply(@NonNull String name) throws Exception {
    9. Log.e("rxjava", "apply " + name);
    10. return new Fruit(name);
    11. }
    12. }).subscribe(new Observer<Fruit>() {
    13. @Override
    14. public void onSubscribe(@NonNull Disposable d) {
    15. }
    16. @Override
    17. public void onNext(@NonNull Fruit fruit) {
    18. Log.e("rxjava", "onNext " + fruit.toString());
    19. }
    20. @Override
    21. public void onError(@NonNull Throwable e) {
    22. }
    23. @Override
    24. public void onComplete() {
    25. Log.e("rxjava", "onComplete");
    26. }
    27. });
    28. 执行结果:
    29. rxjava: apply0 apple
    30. rxjava: apply1 apple_1
    31. rxjava: onNext Fruit{name='apple_1'}

    map 返回的是一个 ObservableMap对象,接收一个 Function 泛型类。T是传入的类型,R是返回的类型。
    所谓转换,就是通过applay函数,将传入的T类型,转换成R类型。map后面可以跟多个map,将apply产生的对象,继续向下传递。
    上面的例子,就是将传入的字符串"apple" 通过map的apply转换函数,转换成Fruit对象,
    传递给下游的被观察者。map可以把一串Json字符串,转换成一个list的集合对象。

    2.flatMap

    1. Observable.create(new ObservableOnSubscribe<String>() {
    2. @Override
    3. public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
    4. for (int i = 0; i < 3; i++) {
    5. emitter.onNext(String.valueOf(i));
    6. }
    7. }
    8. }).flatMap(new Function<String, ObservableSource<String>>() {
    9. @Override
    10. public ObservableSource<String> apply(@NonNull String s) throws Exception {
    11. List<String> list = new ArrayList<>();
    12. list.add("apple" + s);
    13. return Observable.fromIterable(list);
    14. }
    15. }).map(new Function<String, Fruit>() {
    16. @Override
    17. public Fruit apply(@NonNull String name) throws Exception {
    18. Log.e("rxjava","apply "+name);
    19. return new Fruit(name);
    20. }
    21. }).subscribe(new Observer<Fruit>() {
    22. @Override
    23. public void onSubscribe(@NonNull Disposable d) {
    24. }
    25. @Override
    26. public void onNext(@NonNull Fruit fruit) {
    27. Log.e("rxjava","onNext "+fruit.toString());
    28. }
    29. @Override
    30. public void onError(@NonNull Throwable e) {
    31. }
    32. @Override
    33. public void onComplete() {
    34. }
    35. });
    36. 执行结果:
    37. rxjava: apply apple0
    38. rxjava: onNext Fruit{name='apple0'}
    39. rxjava: apply apple1
    40. rxjava: onNext Fruit{name='apple1'}
    41. rxjava: apply apple2
    42. rxjava: onNext Fruit{name='apple2'}

    flatMap 返回的是 ObservableFlatMap对象,接收的是Function>这样一个参数。
    调用apply返回给下游的就是ObservableSource这样一个被观察者,而map执行apply是返回的转换后的对象,这个是map和flatMap最大的区别。

    flatMap返回的是一个被观察者,下游可以跟一个被观察者也可以跟观察者。

    3.concatMap
      和flatMap差不多

    1. Observable.create(new ObservableOnSubscribe<String>() {
    2. @Override
    3. public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
    4. for (int i = 0; i < 3; i++) {
    5. emitter.onNext(String.valueOf(i));
    6. }
    7. }
    8. }).concatMap(new Function<String, ObservableSource<String>>() {
    9. @Override
    10. public ObservableSource<String> apply(@NonNull String s) throws Exception {
    11. List<String> list = new ArrayList<>();
    12. list.add("apple" + s);
    13. return Observable.fromIterable(list);
    14. }
    15. }).map(new Function<String, Fruit>() {
    16. @Override
    17. public Fruit apply(@NonNull String name) throws Exception {
    18. Log.e("rxjava","apply "+name);
    19. return new Fruit(name);
    20. }
    21. }).subscribe(new Observer<Fruit>() {
    22. @Override
    23. public void onSubscribe(@NonNull Disposable d) {
    24. }
    25. @Override
    26. public void onNext(@NonNull Fruit fruit) {
    27. Log.e("rxjava","onNext "+fruit.toString());
    28. }
    29. @Override
    30. public void onError(@NonNull Throwable e) {
    31. }
    32. @Override
    33. public void onComplete() {
    34. }
    35. });
    36. 执行结果:
    37. rxjava: apply apple0
    38. rxjava: onNext Fruit{name='apple0'}
    39. rxjava: apply apple1
    40. rxjava: onNext Fruit{name='apple1'}
    41. rxjava: apply apple2
    42. rxjava: onNext Fruit{name='apple2'}

    concatMap返回的是ObservableConcatMap一个对象。接收的是Function>类型
    apply返回的就是ObservableSource类型。

  • 相关阅读:
    以树莓集团的视角:探索AI技术如何重塑数字媒体产业发展
    centos7安装msSQLserver数据库
    Java并发编程——Java筑基
    专利快速预审主体备案服务指南
    Android Jetpack学习系列——WorkManager
    【2022蓝帽杯】file_session && 浅入opcode
    java版本转换小工具
    ssm基于JavaEE的电脑销售管理系统设计与实现毕业设计源码021143
    2022牛客暑期多校训练营7(总结+补题)
    Quartus 实例应用(2)——创建设计工程
  • 原文地址:https://blog.csdn.net/niuyongzhi/article/details/126925247