专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
鸿洋  ·  细嗅蔷薇,Gradle 系列之 Task 必知必会 ·  2 天前  
stormzhang  ·  来自李子柒的压迫感 ·  3 天前  
鸿洋  ·  理解Android ... ·  3 天前  
鸿洋  ·  Android H5页面性能分析策略 ·  5 天前  
51好读  ›  专栏  ›  安卓开发精选

RxJava操作符系列三(下)

安卓开发精选  · 公众号  · android  · 2016-12-30 21:48

正文

(点击上方公众号,可快速关注)


来源:伯乐在线专栏作者 - Code4Android

链接:http://android.jobbole.com/85254/

如有好文章投稿,请点击 → 这里了解详情


接上文


Take


Take操作符可以修改Observable的行为,只返回前面的N项数据,然后发射完成通知,忽略剩余的数据。


Observable.range(1,8)

          .take(4)

          .subscribe(new Subscriber() {

        @Override

        public void onNext(Integer item) {

           Log.e(TAG, "Next: " + item);

        }

 

        @Override

        public void onError(Throwable error) {

            Log.e(TAG, "Error: " + error.getMessage());

        }

 

        @Override

        public void onCompleted() {

           Log.e(TAG, "complete.");

        }

    });


输出日志信息


Next1

Next2

Next3

Next4

complete


take和skip一样也有其它两个重载方法take(long time, TimeUnit unit),take(long time, TimeUnit unit, Scheduler scheduler),默认在computation调度器上执行。

take还有变体操作符TakeLast,takeLastBuffer具体执行效果可自行代码。


Debounce


该操作符指的是过了一段指定的时间还没发射数据时才发射一个数据,听着可能有点绕。你可以理解对源Observable间隔期产生的结果进行过滤,如果在这个规定的间隔期内没有别的结果产生,则将这个结果提交给订阅者,否则忽略该结果,原理有点像光学防抖


上代码


Observable.range(1,8)

          .take(4)

          .subscribe(new Subscriber() {

        @Override

        public void onNext(Integer item) {

           Log.e(TAG, "Next: " + item);

        }

 

        @Override

        public void onError(Throwable error) {

            Log.e(TAG, "Error: " + error.getMessage());

        }

 

        @Override

        public void onCompleted() {

           Log.e(TAG, "complete.");

        }

    });


输出信息


onNext4

onNext5

onNext6

onNext7

onNext8

onNext9

onCompleted:


这个输出数据不一定一样,有可能从5开始。


Distinct


这个比较好理解,它就是过滤掉重复的数据,只允许还没有发射过的数据项通过。


示例代码


Observable.just(0, 0, 6, 4, 2, 8, 2, 1, 9, 0)

                .distinct()

                .subscribe(new Subscriber() {

                    @Override

                    public void onCompleted() {

                        Log.e(TAG, "onCompleted:Distinct ");

                    }

 

                    @Override

                    public void onError(Throwable e) {

                        Log.e(TAG, "onError:Distinct ");

                    }

 

                    @Override

                    public void onNext(Integer integer) {

                        Log.e(TAG, "onNext:Distinct " + integer);

                    }

                });


输出日志信息


onNext:Distinct 0

onNext:Distinct 6

onNext:Distinct 4

onNext:Distinct 2

onNext:Distinct 8

onNext:Distinct 1

onNext:Distinct 9

onCompleted:Distinct


ElementAt


该操作符获取原始Observable发射的数据序列指定索引位置的数据项,然后当做自己的唯一数据发射。给它传递一个基于0的索引值,它会发射原始Observable数据序列对应索引位置的值,如果你传递给elementAt的值为4,那么它会发射第5项的数据。如下示例代码


Observable.just(0, 0, 6, 4, 2, 8, 2, 1, 9, 0)

                .elementAt(4)

                .subscribe(new Subscriber() {

                    @Override

                    public void onCompleted() {

                        Log.e(TAG, "onCompleted:ElementAt ");

                    }

 

                    @Override

                    public void onError(Throwable e) {

                        Log.e(TAG, "onError:ElementAt ");

                    }

 

                    @Override

                    public void onNext(Integer integer) {

                        Log.e(TAG, "onNext:ElementAt " + integer);

                    }

                });


输出日志信息


onNext:ElementAt 2

onCompleted:ElementAt


IgnoreElements


操作符抑制原始Observable发射的所有数据,只允许它的终止通知(onError或onCompleted)通过,使用该操作符onNext()方法不会执行。


 Observable.just(1, 2, 3).ignoreElements().subscribe(new Subscriber() {

            @Override

            public void onCompleted() {

                Log.e(TAG, "onCompleted");

            }

 

            @Override

            public void onError(Throwable e) {

                Log.e(TAG, "onError");

            }

 

            @Override

            public void onNext(Integer integer) {

                Log.e(TAG, "onNext");

            }

        });


执行后只会输出onCompleted。这个操作符效果就如同empty()方法创建一个空的Observable,只会执行onCompleted()方法,不同的是ignoreElements是对数据源的处理,而empty()是创建Observable。

今天的这篇文章就到此结束,欢迎大家阅读,若发现文中有错误的地方欢迎留言提出,感谢。


 看完本文有收获?请分享给更多人

关注「安卓开发精选」,看技术干货