RxJava2 转换操作符之ContactMap()和flatMapIterable()

前言:
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库。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值