RxJava学习第二篇---RxJava调度器以及操作符使用

第一篇:重新认识RxJava以及基本使用

第二篇:RxJava调度器以及操作符使用

第三篇:反压学习,RxAndroid的使用和总结


RxJava中操作符主要有  创建、变换、组合、功能、过滤、布尔。

创建操作符:用于创建 被观察者和发送事件。上文中我们用到的create()就是一个创建操作符,当然创建操作符不止只一个,还有很多,不如:just()   timer()  interval()  等等;

    //just用于快速创建被观察者并发送数据,just最多只能发送10个数据
        Observable.just(1,2,3,4,5,6,7,8,9,10)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {

                    }
                });
     //快速创建并发行Array数组
        Observable.fromArray(strarr)
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {

                    }
                });
      //定时发送一次
        Observable.timer(1000, TimeUnit.MILLISECONDS)
                .subscribe();
        //轮循固定时间不间断发送
        Observable.interval(1000,10000,TimeUnit.MILLISECONDS)
                .subscribe();
        //每隔固定时间发送一个事件,事件的数量可以指定
        Observable.intervalRange(1000,10,0,1000,TimeUnit.MILLISECONDS)
                .subscribe();
        //无延迟的从指定开始值 发送指定数量的事件
        Observable.range(1,100)
                .subscribe();
剩下的大家可以自行测试。


变换操作符:主要用于将发送的时间进行加工处理,处理成我们需要的消息,比如有:map()  buffer()等

        //通过map将发送的Integer类型转换为String类型
        Observable.just(1, 2, 3, 4, 5)
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return integer + "";
                    }
                }).subscribe();
        //将原先的事件拆分,然后将单个事件重新整合然后在无序发出
        Observable.just(1,2,3,4,5)
                .flatMap(new Function<Integer, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(Integer integer) throws Exception {
                        List<String> list = new ArrayList<>();
                        for (int i = 5; i < 8; i++) {
                            list.add("原事件:"+integer+"新增事件:"+i);
                        }
                        return Observable.fromIterable(list);
                    }
                }).subscribe();
concatMap()和flatMap()基本一致,只是整合后有序的发出
        //定义一个缓存区,每次从被观察者中取指定个数的事件发送
        Observable.just(1,2,3,4,5)
                .buffer(3,1)
                .subscribe();

组合操作符:用于用于合并多个被观察者发送事件,比如:concat() count()等

        //组合多个被观察者按组合顺序发出(concatArray区别在于发送个数)
        Observable.concat(Observable.just(1,2,3),Observable.just(4,5,6))
                .subscribe();
        //组合多个被观察者按事件时间顺序发出(mergeArray区别在于发送个数)
        Observable.merge(Observable.just(1,2,3),Observable.just(4,5,6))
                .subscribe();
        //将两个被观察者中的事件合并,然后发出,事件数量以少的被贯穿者为准
        Observable.zip(Observable.just(1, 2, 3), Observable.just("A", "B", "C", "D"), new BiFunction<Integer, String, String>() {
            @Override
            public String apply(Integer integer, String s) throws Exception {
                return integer + s;
            }
        }).subscribe();

        //将被观察者发送的数据整理到一个数据结构里发送
        Observable.just(1,2,3,4)
                .collect(new Callable<List<Integer>>() {
                    @Override
                    public List<Integer> call() throws Exception {
                        return new ArrayList<>();
                    }
                }, new BiConsumer<List<Integer>, Integer>() {
                    @Override
                    public void accept(List<Integer> integers, Integer integer) throws Exception {
                        integers.add(integer);
                    }
                }).subscribe();

功能操作符:在被观察者和观察者之间做桥梁,比如 subscribe() subscribeOn()等

        Observable.just(1, 2, 3, 4, 5)
                .subscribeOn(Schedulers.newThread())//被观察者的线程
                .observeOn(Schedulers.io())//观察者的线程
                .delay(1000, TimeUnit.MILLISECONDS)//被观察者延迟一段时间发送
                .doOnEach(new Consumer<Notification<Integer>>() {//被观察者每次发送数据都会调用(结束异常都会调用)
                    @Override
                    public void accept(Notification<Integer> integerNotification) throws Exception {

                    }
                })
                .doOnNext(new Consumer<Integer>() {//被观察者发送onNext之前调用
                    @Override
                    public void accept(Integer integer) throws Exception {

                    }
                })
                .doAfterNext(new Consumer<Integer>() {//被观察者发送onNext之后调用
                    @Override
                    public void accept(Integer integer) throws Exception {

                    }
                })
                .doOnError(new Consumer<Throwable>() {//被观察者发送错误时候调用
                    @Override
                    public void accept(Throwable throwable) throws Exception {

                    }
                })
                .doOnComplete(new Action() {//被观察者正茬发送完毕调用
                    @Override
                    public void run() throws Exception {

                    }
                })
                .doOnTerminate(new Action() {//被观察者无论正常还是异常结束都会调用
                    @Override
                    public void run() throws Exception {

                    }
                })
                .doFinally(new Action() {//最后执行
                    @Override
                    public void run() throws Exception {

                    }
                })
                .doOnSubscribe(new Consumer<Disposable>() {//订阅时候调用
                    @Override
                    public void accept(Disposable disposable) throws Exception {

                    }
                })
                .onErrorReturn(new Function<Throwable, Integer>() {//如果遇到异常,发送一个特定的事件正常终止
                    @Override
                    public Integer apply(Throwable throwable) throws Exception {
                        return null;
                    }
                })
                .retry()//如果出现错误重试
                .subscribe();


过滤操作符:主要用于过滤筛选被观察者发送的事件,比如 :skip()  take()等

        //当filter中返回true时候继续发送
        Observable.just(1, 2, 3, 4, 5)
                .filter(new Predicate<Integer>() {
                    @Override
                    public boolean test(Integer integer) throws Exception {
                        return integer > 2;
                    }
                }).subscribe(); 
        //过滤指定类型
        Observable.just(1,"",2,"")
                .ofType(Integer.class)
                .subscribe();
        Observable.just(1,2,3,4)
                .skip(1)//跳过正序指定个事件
                .skipLast(2)//跳过正序最后指定个数事件
                .subscribe();
        Observable.just(1, 2, 3, 1, 2, 3, 3, 4, 4)
                .distinctUntilChanged()//过滤连续重复事件
                .distinct()//过滤全部重复事件
                .take(2)//观察者只能接收两个事件
                .takeLast(2)//观察者只能接收最后两个事件
                .throttleFirst(1, TimeUnit.MILLISECONDS)//指定时间间隔后的第一个事件
                .throttleLast(1, TimeUnit.MILLISECONDS)//指定试讲间隔前最后一个事件
                .throttleWithTimeout(1, TimeUnit.MILLISECONDS)//如果间隔小于指定时间,丢掉前一个数据
                .firstElement()//只发送第一个数据
                .subscribe();

布尔操作符:判断被观察者发送的事件是否符合要求 ,比如:all() amb()等

        Observable.just(1, 2, 3, 4, 5, 6)
                .all(new Predicate<Integer>() {//验证所有事件是否都满足条件,然后发送一个结果
                    @Override
                    public boolean test(Integer integer) throws Exception {
                        return integer < 10;
                    }
                }).subscribe();
        Observable.just(1, 2, 3, 4, 5.6)
                .takeWhile(new Predicate<Number>() {//事件满足条件才会发送
                    @Override
                    public boolean test(Number number) throws Exception {
                        return (number.intValue() > 2);
                    }
                }).subscribe();
        Observable.just(1, 2, 3, 4, 5, 6)
                .takeUntil(new Predicate<Integer>() {//事件满足条件时候停止发送
                    @Override
                    public boolean test(Integer integer) throws Exception {
                        return integer == 2;
                    }
                }).subscribe();
        Observable.just(1,2,3,4,5)
                .contains(4)//判断发送的事件中时候有指定事件
                .subscribe();


(在没有经过别人同意的情况下盗用一张图,如果该博主介意的话请联系我!)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值