Rxjava2操作符(二)

友情链接:
Rxjava操作符2(一)
Rxjava操作符2(二)
Rxjava操作符2(三)
demo地址:github

转化型

Map 对Observable发射的每一项数据都用一个函数来进行转换。

实例: 发射过来的数乘以2

 Observable.just(1, 2, 3, 4).map(new Function<Integer, Integer>() {
                    @Override
                    public Integer apply(Integer integer) throws Exception {
                        return integer * 2;
                    }
                }).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer s) throws Exception {
                        Log.i(TAG, "map:" + s);
                    }
                });
复制代码

打印的是:

12-11 06:16:30.758 2284-2284/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: map:2
12-11 06:16:30.758 2284-2284/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: map:4
12-11 06:16:30.758 2284-2284/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: map:6
12-11 06:16:30.758 2284-2284/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: map:8
复制代码

FlatMap 创建多个Observable

将一个发送事件的上游Observable变换为多个发送事件的Observables,然后将它们发射的事件合并后放进一个单独的Observable里.如果要保证顺序的话,可以使用concatMap。
实例:把发送过来数据都变成发射一个集合的Observable

  • 应用场景:用户注册成功后需要自动登录 先调用注册接口,成功后在调用登录接口
 Observable.just(1, 2, 3, 4).flatMap(new Function<Integer, Observable<Integer>>() {
                    @Override
                    public Observable<Integer> apply(Integer integer) throws Exception {
                        ArrayList<Integer> integers = new ArrayList<>();
                        for (int i = 0; i < 3; i++) {
                            integers.add(i);
                        }
                        return Observable.fromIterable(integers);
                    }
                }).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer s) throws Exception {
                        Log.i(TAG, "flatMap:" + s);
                    }
                });
复制代码

打印的是:

12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:0
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:1
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:2
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:0
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:1
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:2
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:0
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:1
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:2
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:0
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:1
12-11 06:20:12.486 3617-3617/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: flatMap:2
复制代码

buffer(long count, long skip) 把发送过来的数据收集成一个集合, 然后发送一个集合给下游

count:表示一个集合中可以收集几个数据 skip:表示每隔第几个Observable 发送过来的 开始收集数据 实例: 通过下面的实例可以更好的理解

Observable.just(1, 2, 3,4,5,6,7,8,9).buffer(4,2).subscribe(new Consumer<List<Integer>>() {
                    @Override
                    public void accept(List<Integer> integers) throws Exception {
                        Log.i(TAG, "buffer:" + integers);
                    }
                });
复制代码

打印出来:

12-11 06:46:29.283 5994-5994/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: buffer:[1, 2, 3, 4]
12-11 06:46:29.283 5994-5994/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: buffer:[3, 4, 5, 6]
12-11 06:46:29.283 5994-5994/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: buffer:[5, 6, 7, 8]
12-11 06:46:29.283 5994-5994/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: buffer:[7, 8, 9]
12-11 06:46:29.283 5994-5994/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: buffer:[9]
复制代码

window(long count, long skip) 类似于buffer缓存一个list集合,区别在于window将这个结果集合封装成了observable

实例:

 Observable.just(1, 2, 3,4,5,6,7,8,9).window(2, 3).subscribe(new Consumer<Observable<Integer>>() {
                    @Override
                    public void accept(Observable<Integer> integerObservable) throws Exception {
                        Log.i(TAG, "window:" + integerObservable);
                        integerObservable.subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "window:" + integer);

                            }
                        });
                    }
                });
复制代码

打印结果:

-11 07:01:12.387 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:io.reactivex.subjects.UnicastSubject@f87e3b7
12-11 07:01:12.387 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:1
12-11 07:01:12.387 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:2
12-11 07:01:12.387 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:io.reactivex.subjects.UnicastSubject@ac7e724
12-11 07:01:12.387 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:4
12-11 07:01:12.387 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:5
12-11 07:01:12.387 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:io.reactivex.subjects.UnicastSubject@962928d
12-11 07:01:12.388 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:7
12-11 07:01:12.388 7191-7191/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: window:8
复制代码

groupBy 将Observable分拆为Observable集合,将原始Observable发射的数据按Key分组,每一个Observable发射一组不同的数据。

 Observable.just(1, 2, 3,4,5).groupBy(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return integer%2==0?"偶数":"奇数";
                    }
                }).subscribe(new Consumer<GroupedObservable<String, Integer>>() {
                    @Override
                    public void accept(final GroupedObservable<String, Integer> stringIntegerGroupedObservable) throws Exception {
                        stringIntegerGroupedObservable.subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "groupby:" +stringIntegerGroupedObservable.getKey()+"----"+ integer);
                            }
                        });
                    }
                });
复制代码

打印结果:

2-11 07:35:40.544 8600-8600/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: groupby:奇数----1
12-11 07:35:40.544 8600-8600/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: groupby:偶数----2
12-11 07:35:40.544 8600-8600/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: groupby:奇数----3
12-11 07:35:40.544 8600-8600/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: groupby:偶数----4
12-11 07:35:40.544 8600-8600/niezhiyang.cn.rxjava2_android_samples I/TransformingActivity: groupby:奇数----5
复制代码

过滤型

filter 最基本的过滤

实例: 过滤大于发射过来大于2的数据Observable

 Observable.just(1, 2, 3, 4, 5, 6)
                        .filter(new Predicate<Integer>() {
                            @Override
                            public boolean test(Integer integer) throws Exception {
                                return integer > 2;
                            }
                        })
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "filter--大于2的数据有:" + integer);
                            }
                        });

复制代码

打印出来:

12-11 09:15:58.329 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: filter--大于2的数据有:3
12-11 09:15:58.329 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: filter--大于2的数据有:4
12-11 09:15:58.329 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: filter--大于2的数据有:5
12-11 09:15:58.329 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: filter--大于2的数据有:6
复制代码

distince 去除重复的Observable

实例:

  Observable.just(1, 1, 3, 3, 5, 6)
                        .distinct()
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "distinct--去除重复的数据:" + integer);
                            }
                        });
复制代码

打印出来:

12-11 09:17:10.046 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: distinct--去除重复的数据:1
12-11 09:17:10.046 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: distinct--去除重复的数据:3
12-11 09:17:10.046 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: distinct--去除重复的数据:5
12-11 09:17:10.046 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: distinct--去除重复的数据:6
复制代码

distince 去除重复的Observable

实例:

  Observable.just(1, 1, 3, 3, 5, 6)
                        .distinct()
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "distinct--去除重复的数据:" + integer);
                            }
                        });
复制代码

打印出来:

12-11 09:17:10.046 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: distinct--去除重复的数据:1
12-11 09:17:10.046 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: distinct--去除重复的数据:3
12-11 09:17:10.046 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: distinct--去除重复的数据:5
12-11 09:17:10.046 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: distinct--去除重复的数据:6
复制代码

skip 跳过前几个数据的Observable

实例: 跳过前两个

 Observable.just(1, 2, 3, 4, 5, 6)
                        .skip(2)
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "skip--跳过的数据:" + integer);
                            }
                        });
复制代码

打印出来:

12-11 09:17:37.919 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: skip--跳过的数据:3
12-11 09:17:37.919 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: skip--跳过的数据:4
12-11 09:17:37.919 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: skip--跳过的数据:5
12-11 09:17:37.919 12569-12569/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: skip--跳过的数据:6
复制代码

take 只发射前几个数组的Observable

实例: 发射前两个

  Observable.just(1, 2, 3, 4, 5, 6)
                        .take(2)
//                        .take(1000, TimeUnit.MICROSECONDS)
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "take--发射的前两个数据:" + integer);
                            }
                        });
复制代码

打印出来:

12-11 09:22:08.607 13137-13137/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: take--发射的前两个数据:1
12-11 09:22:08.607 13137-13137/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: take--发射的前两个数据:2
复制代码

重载 take(1000, TimeUnit.MICROSECONDS) 至发射前1000ms的数据

last 只发射最后一项(或者满足某个条件的最后一项)数据,可以指定默认值。

实例: 发射前两个

Observable.just(1, 2, 3, 4, 5, 6)
                        .last(3)
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                Log.i(TAG, "last--最后的数据:" + integer);
                            }
                        });
复制代码

打印出来:

12-11 09:26:11.404 13510-13510/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: last--最后的数据:6
复制代码

debounce 如果两次数据的发射间隔小于指定时间,就会丢弃前一次的数据。

  • 使用场景一: 搜索框搜索的时候,比如搜索"我的"的时候,输入"我"会搜出来内容,之后有打了个"的"字,这下就变成"我的"的搜索来的内容了,用这个操作符完全可以解决
  Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                        emitter.onNext(1);
                        emitter.onNext(2);
                        emitter.onNext(3);
                        emitter.onNext(4);
                        emitter.onNext(5);
                        Thread.sleep(2000);
                        emitter.onNext(6);
                        emitter.onNext(7);
                        emitter.onComplete();
                    }
                }).debounce(1000, TimeUnit.MICROSECONDS).subscribeOn(Schedulers.io()).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "debounce--:" + integer);
                    }
                });
复制代码

打印出来:

12-11 09:33:30.191 14526-14561/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: debounce--:5
12-11 09:33:32.191 14526-14560/niezhiyang.cn.rxjava2_android_samples I/FilteringActivity: debounce--:7
复制代码

组合型

zip 通过一个函数将多个Observable发送的事件结合到一起,然后发送这些组合到一起的事件. 它按照严格的顺序应用这个函数。它只发射与发射数据项最少的那个Observable一样多的数据。

  • 使用场景: 实现多个接口数据共同更新 UI
 Observable<Integer> observable1 = Observable.just(1, 2, 3, 4);
                Observable<Integer> observable2 = Observable.just(1, 2, 3);
                Observable.zip(observable1, observable2, new BiFunction<Integer, Integer, String>() {
                    @Override
                    public String apply(Integer integer, Integer integer2) throws Exception {
                        return integer + integer2 + "";
                    }
                }).subscribe(new Consumer<String>() {

                    @Override
                    public void accept(String s) throws Exception {
                        Log.i(TAG, "zip合并后的数据是:" + s);
                    }
                });
复制代码

打印出来的是:

12-12 03:38:43.695 2328-2328/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: zip合并后的数据是:2
12-12 03:38:43.695 2328-2328/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: zip合并后的数据是:4
12-12 03:38:43.695 2328-2328/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: zip合并后的数据是:6
复制代码

concat 是接收若干个Observables,发射数据是有序的,不会交叉 , 如果第一个发送onNext的话就不会走第二个Observable,如果第一个发送的是onComplete那么就走第二个Observable

  • 使用场景一: 当请求数据的时候,如果有缓存的话先从缓存中读取,如果缓存没有的话在从网络读取
  • 使用场景二: 当请求网络数据的时候,如果网络数据有错误的话,就展示缓存的数据
 Observable<Integer> observable3 = Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                        if (true) {
                        //假如有缓存就走这里
                            e.onNext(1);
                        } else {
                         //假如没有缓存就走这里
                            e.onComplete();
                        }

                    }
                });
                Observable<Integer> observable4 = Observable.just(1, 2, 3);
                Observable.concat(observable3, observable4).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "concat的数据是:" + integer);
                    }
                });
复制代码

打印出来的是:

12-12 03:50:37.258 4663-4663/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: concat的数据是:1
复制代码

merge 将多个Observable合并为一个。不同于concat,merge不是按照添加顺序连接,而是按照时间线来连接。把多个被观察者合并到一个被观察者身上一起输出,但是可能会让合并的被观察者发射的数据交错

 Observable<Integer> observable3 = Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                        if (true) {
                            e.onNext(1);
                        } else {
                            e.onComplete();
                        }

                    }
                });
                Observable<Integer> observable4 = Observable.just(1, 2, 3);
                Observable.concat(observable3, observable4).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "concat的数据是:" + integer);
                    }
                });
复制代码

打印出来的是:

12-12 05:09:03.431 7528-7558/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: merge合并后的数据是:4
12-12 05:09:03.431 7528-7558/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: merge合并后的数据是:1
12-12 05:09:03.431 7528-7558/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: merge合并后的数据是:2
12-12 05:09:03.431 7528-7558/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: merge合并后的数据是:3
12-12 05:09:03.431 7528-7558/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: merge合并后的数据是:5
12-12 05:09:03.431 7528-7558/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: merge合并后的数据是:6
复制代码

combineLatest用来将多个Observable发射的数据组装起来然后在发射

  • 使用场景一: 来做Android表单的校验 ,比如所有的数据不为空的时候,设置提交按钮可以点击
 Observable<Integer> observable7 = Observable.just(1, 2, 3);
                Observable<Integer> observable8 = Observable.just(4, 5, 6, 7);
                Observable.combineLatest(observable7, observable8, new BiFunction<Integer, Integer, Integer>() {
                    @Override
                    public Integer apply(Integer integer, Integer integer2) throws Exception {
                        //integer 这个就是observable7中最后发的一个元素
                        return integer+integer2;
                    }
                }).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "combineLatest的数据是:" + integer);
                    }
                });
复制代码

打印出来的是:

12-12 05:17:00.774 8427-8427/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: combineLatest的数据是:7
12-12 05:17:00.774 8427-8427/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: combineLatest的数据是:8
12-12 05:17:00.774 8427-8427/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: combineLatest的数据是:9
12-12 05:17:00.774 8427-8427/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: combineLatest的数据是:10
复制代码

startWith增加一点同类型的数据

 Observable.just(1, 2, 3).startWith(0).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "startWith添加后的数据是:" + integer);
                    }
                });
复制代码

打印出来的是:

12-12 05:17:54.255 8427-8427/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: startWith添加后的数据是:0
12-12 05:17:54.255 8427-8427/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: startWith添加后的数据是:1
12-12 05:17:54.255 8427-8427/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: startWith添加后的数据是:2
12-12 05:17:54.255 8427-8427/niezhiyang.cn.rxjava2_android_samples I/CombiningActivity: startWith添加后的数据是:3
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值