4. Rxjava2 : 变换操作符

1. RxJava2 : 什么是观察者模式
2. RxJava2 : 创建操作符(无关时间)
3. Rxjava2 : 创建操作符(有关时间)
4. Rxjava2 : 变换操作符
5. Rxjava2 : 判断操作符
6. Rxjava2 : 筛选操作符
7. Rxjava2 : 合并操作符
8. Rxjava2 : do操作符
9. Rxjava2 : error处理
10. Rxjava2 : 重试
11. Rxjava2 : 线程切换

api use
map {{map}}
flatmap / concatMap {{flatmap}}
buffer {{buffer}}

map

  1. 操作的是每一个元素,所有元素均会发生改变
  2. 但元素的个数不会改变
  3. 是否会发送onComplete,取决于创建方式是否会发送
Observable.just(1, 2, 3)
                .map(new Function() {
                    @Override
                    public Integer apply(Integer integer) throws Exception {
                        return integer + 10;
                    }
                }).subscribe(new Observer() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.d(TAG, "integer:" + integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete");
            }
        });

log

02-12 15:39:20.253 31399-31399/... D/SplashActivity: integer:11
02-12 15:39:20.253 31399-31399/... D/SplashActivity: integer:12
02-12 15:39:20.253 31399-31399/... D/SplashActivity: integer:13
02-12 15:39:20.253 31399-31399/... D/SplashActivity: onComplete

flatmap / concatMap

  • flatmap
    1.与map类似,操作的同样是每一个元素
    2.区别是,可以将元素转换成Oberservable,然后再继续发送,也就是说数量可变
    3.元素是无序的
    4.是否会发送onComplete,取决于创建方式是否会发送

  • concatMap
    均于flatmap相同,只是元素是有序的

流程

Observable.just(1,2,3)
->
元素 1,元素 2, 元素 3
他们全部来自于一个Observable
->
元素 1 -> Observable (元素:1 子元素0, 元素:1 子元素1, 元素:1 子元素2)
...
->
现在一共有3*3,9个元素
->
subscribe
->
Observer
这9个元素可能会是无序的
Disposable disposable = Observable
                .just(1, 2, 3)
                .flatMap((Function>) integer -> {
                    List strings = new ArrayList<>();
                    strings.add("event: " + integer + " list: 0");
                    strings.add("event: " + integer + " list: 1");
                    strings.add("event: " + integer + " list: 2");
                    return Observable.fromIterable(strings);
                }).subscribe(
                        s -> {
                            Log.d(TAG, s);
                        });

log

01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 1 list: 0
01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 1 list: 1
01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 1 list: 2
01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 2 list: 0
01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 3 list: 1
01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 2 list: 2
01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 2 list: 1
01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 3 list: 0
01-30 15:03:19.086 15381-15381/... D/ShellAppApplication: event: 3 list: 2

buffer

  • 基于数量
    1.参数1: 每回取的数量,参数2: 跳过的数量
    2.如果未指定跳过的数量,则取了几个就跳过几个
    3.如果指定了跳过的数量,则按照指定跳过,并且list.size() = 发送数量/skip+1
    4.是否会发送onComplete,取决于创建方式是否会发送
//不采用跳过
Observable.just(1,2,3,4,5)
                .buffer(3)
.subscribe(new Observer>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(List integers) {
                Log.d(TAG, "integers:" + integers);
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete");
            }
        });

log

02-12 16:08:07.723 32515-32515/... D/SplashActivity: integers:[1, 2, 3]
02-12 16:08:07.723 32515-32515/... D/SplashActivity: integers:[4, 5]
02-12 16:08:07.723 32515-32515/... D/SplashActivity: onComplete
//采用跳过,即可看到,最后一个集合只包含一个[5]
Observable.just(1, 2, 3, 4, 5)
                .buffer(3, 2)
                .subscribe(new Observer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(List integers) {
                        Log.d(TAG, "integers:" + integers);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete");
                    }
                });

log

02-12 16:12:56.273 531-531/... D/SplashActivity: integers:[1, 2, 3]
02-12 16:12:56.273 531-531/... D/SplashActivity: integers:[3, 4, 5]
02-12 16:12:56.273 531-531/... D/SplashActivity: integers:[5]
02-12 16:12:56.273 531-531/... D/SplashActivity: onComplete
  • 基于时间
    1.发送的元素,并不会直接用于Observer,而是会暂存在一个缓存区当中,以指定的时间去取
    2.可能会存在取不到值的情况,缓存区当中没有值
    3.最后一次取值时间会于之前不同
    4.是否会发送onComplete,取决于创建方式是否会发送

流程

元素 时间 所取值
in 0 没取
0 1 没取
1 2 第一次取值,1还没有进入缓存区,只取到0
2 3 没取
3 4 第二次取值,现在缓存区中存在1,2
4 5 因为这是最后两个值了,所以会提前取,全部取出
Log.d(TAG, "in");
        Observable.interval(1, TimeUnit.SECONDS)
                .take(5)
                .buffer(2, TimeUnit.SECONDS)
                .subscribe(new Observer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(List longs) {
                        Log.d(TAG, "longs:" + longs);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete");
                    }
                });

log

02-12 16:19:12.293 1345-1345/... D/SplashActivity: in
02-12 16:19:14.303 1345-1401/... D/SplashActivity: longs:[0]
02-12 16:19:16.303 1345-1401/... D/SplashActivity: longs:[1, 2]
02-12 16:19:17.303 1345-1402/... D/SplashActivity: longs:[3, 4]
02-12 16:19:17.303 1345-1402/... D/SplashActivity: onComplete
  • 数量和时间同时作用

流程

元素 时间 所取值
in 0 没取
0 1 没取
1 2 第一次取值,满足的是数量,取0,1
2 3 第二次取值,满足的是时间,这个时候,缓存区中的元素已经通过数量取走了,因此什么也没有取到
3 4 没取
4 5 第三次取值,满足的是数量,取2,3
5 6 第四次取值,满足的是时间,这个时候,缓存区中的元素只剩下一个4
6 7 第五次取值,满足的是数量,取5,6 同时进行第六次取值,因为结束,触发时间取值,但什么也没有取到
Log.d(TAG, "in");
        Observable.interval(1, TimeUnit.SECONDS)
                .take(7)
                .buffer(3, TimeUnit.SECONDS,2)
                .subscribe(new Observer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(List longs) {
                        Log.d(TAG, "longs:" + longs);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete");
                    }
                });

log

02-12 16:31:47.043 2152-2152/... D/SplashActivity: in
02-12 16:31:49.063 2152-2225/... D/SplashActivity: longs:[0, 1]
02-12 16:31:50.053 2152-2224/... D/SplashActivity: longs:[]
02-12 16:31:51.053 2152-2225/... D/SplashActivity: longs:[2, 3]
02-12 16:31:53.053 2152-2224/... D/SplashActivity: longs:[4]
02-12 16:31:54.053 2152-2225/... D/SplashActivity: longs:[5, 6]
02-12 16:31:54.053 2152-2225/... D/SplashActivity: longs:[]
02-12 16:31:54.053 2152-2225/... D/SplashActivity: onComplete

你可能感兴趣的:(4. Rxjava2 : 变换操作符)